Hinzufügen von Feldern zum Bildschirm "Neuen Benutzer hinzufügen" im Dashboard

13

Ich möchte das Feld "Firmenname" zur Seite "Neuen Benutzer hinzufügen" im Admin-Bereich hinzufügen. Ich habe ziemlich viel gesucht und konnte keine Details dazu finden. Ich kann einfach Informationen zur Profilseite hinzufügen und mich bei ... registrieren.

   function my_custom_userfields( $contactmethods ) {
    //Adds customer contact details
    $contactmethods['company_name'] = 'Company Name';
    return $contactmethods;
   }
   add_filter('user_contactmethods','my_custom_userfields',10,1);

Aber keine Würfel auf irgendetwas anderem.

Zach Shallbetter
quelle
Sie können das ACF-Plugin (Advanced Custom Fields) verwenden , um diese Funktion zu implementieren.
Linish

Antworten:

17

user_new_form ist der Haken, der hier die Magie machen kann.

function custom_user_profile_fields($user){
  ?>
    <h3>Extra profile information</h3>
    <table class="form-table">
        <tr>
            <th><label for="company">Company Name</label></th>
            <td>
                <input type="text" class="regular-text" name="company" value="<?php echo esc_attr( get_the_author_meta( 'company', $user->ID ) ); ?>" id="company" /><br />
                <span class="description">Where are you?</span>
            </td>
        </tr>
    </table>
  <?php
}
add_action( 'show_user_profile', 'custom_user_profile_fields' );
add_action( 'edit_user_profile', 'custom_user_profile_fields' );
add_action( "user_new_form", "custom_user_profile_fields" );

function save_custom_user_profile_fields($user_id){
    # again do this only if you can
    if(!current_user_can('manage_options'))
        return false;

    # save my custom field
    update_usermeta($user_id, 'company', $_POST['company']);
}
add_action('user_register', 'save_custom_user_profile_fields');
add_action('profile_update', 'save_custom_user_profile_fields');

Weitere Informationen finden Sie in meinem Blog: http://scriptbaker.com/adding-custom-fields-to-wordpress-user-profile-and-add-new-user-page/

Tahir Yasin
quelle
13

Ich hatte das gleiche Bedürfnis und erstellte den folgenden Hack:

<?php
function hack_add_custom_user_profile_fields(){
    global $pagenow;

    # do this only in page user-new.php
    if($pagenow !== 'user-new.php')
        return;

    # do this only if you can
    if(!current_user_can('manage_options'))
        return false;

?>
<table id="table_my_custom_field" style="display:none;">
<!-- My Custom Code { -->
    <tr>
        <th><label for="my_custom_field">My Custom Field</label></th>
        <td><input type="text" name="my_custom_field" id="my_custom_field" /></td>
    </tr>
<!-- } -->
</table>
<script>
jQuery(function($){
    //Move my HTML code below user's role
    $('#table_my_custom_field tr').insertAfter($('#role').parentsUntil('tr').parent());
});
</script>
<?php
}
add_action('admin_footer_text', 'hack_add_custom_user_profile_fields');


function save_custom_user_profile_fields($user_id){
    # again do this only if you can
    if(!current_user_can('manage_options'))
        return false;

    # save my custom field
    update_usermeta($user_id, 'my_custom_field', $_POST['my_custom_field']);
}
add_action('user_register', 'save_custom_user_profile_fields');
NkR
quelle
3
Jetzt warten wir auf Ihre Erklärung.
Fuxia
Ich habe den Quellcode in der Datei user-new.php gesehen und habe keinen Aktions-Hook wie "add_user_profile", also simuliere ich dies mit der Aktion "admin_footer_text" und filtere nach $ pagenow == "user-new.php". Jetzt habe ich den Hack kommentiert, um den Code zu erklären.
NkR
3
Warum benutzt du keine user_new_formAktion?
itsazzad
@ SazzadTusharKhan tx für den Zeiger
alex
3

Sie müssen 2 Dinge tun.

  1. Felder registrieren
  2. Felder speichern

Hinweis: Das folgende Beispiel funktioniert nur für die administratorBenutzerrolle.


1. Felder registrieren

Für Add New User Verwendung Aktionuser_new_form

Verwenden Sie für Benutzerprofile Aktionen show_user_profile,edit_user_profile

Felder registrieren

/**
 * Add fields to user profile screen, add new user screen
 */
if( !function_exists('m_register_profile_fields') ) {

    //  This action for 'Add New User' screen
    add_action( 'user_new_form', 'm_register_profile_fields' );

    //  This actions for 'User Profile' screen
    add_action( 'show_user_profile', 'm_register_profile_fields' );
    add_action( 'edit_user_profile', 'm_register_profile_fields' );

    function m_register_profile_fields( $user ) {

        if ( !current_user_can( 'administrator', $user_id ) )
            return false;

        ?>

        <h3>Client Portal</h3>
        <table class="form-table">
            <tr>
                <th><label for="dropdown">Portal Category</label></th>
                <td>
                    <input type="text" class="regular-text" name="portal_cat" value="<?php echo esc_attr( get_the_author_meta( 'portal_cat', $user->ID ) ); ?>" id="portal_cat" /><br />
                </td>
            </tr>
        </table>
    <?php }
}

2. Felder speichern

Für Add New User Verwendung Aktionuser_register

Verwenden Sie für Benutzerprofile Aktionen personal_options_update,edit_user_profile_update

Felder speichern Snippet:

/**
 *  Save portal category field to user profile page, add new profile page etc
 */
if( !function_exists('m_register_profile_fields') ) {

    //  This action for 'Add New User' screen
    add_action( 'user_register', 'cp_save_profile_fields' );

    //  This actions for 'User Profile' screen
    add_action( 'personal_options_update', 'cp_save_profile_fields' );
    add_action( 'edit_user_profile_update', 'cp_save_profile_fields' );

    function cp_save_profile_fields( $user_id ) {

        if ( !current_user_can( 'administrator', $user_id ) )
            return false;

        update_usermeta( $user_id, 'portal_cat', $_POST['portal_cat'] );
    }
}

Vollständiges Code-Snippet:

/**
 * Add fields to user profile screen, add new user screen
 */
if( !function_exists('m_register_profile_fields') ) {

    //  This action for 'Add New User' screen
    add_action( 'user_new_form', 'm_register_profile_fields' );

    //  This actions for 'User Profile' screen
    add_action( 'show_user_profile', 'm_register_profile_fields' );
    add_action( 'edit_user_profile', 'm_register_profile_fields' );

    function m_register_profile_fields( $user ) {

        if ( !current_user_can( 'administrator', $user_id ) )
            return false;

        ?>

        <h3>Client Portal</h3>
        <table class="form-table">
            <tr>
                <th><label for="dropdown">Portal Category</label></th>
                <td>
                    <input type="text" class="regular-text" name="portal_cat" value="<?php echo esc_attr( get_the_author_meta( 'portal_cat', $user->ID ) ); ?>" id="portal_cat" /><br />
                </td>
            </tr>
        </table>
    <?php }
}


/**
 *  Save portal category field to user profile page, add new profile page etc
 */
if( !function_exists('m_register_profile_fields') ) {

    //  This action for 'Add New User' screen
    add_action( 'user_register', 'cp_save_profile_fields' );

    //  This actions for 'User Profile' screen
    add_action( 'personal_options_update', 'cp_save_profile_fields' );
    add_action( 'edit_user_profile_update', 'cp_save_profile_fields' );

    function cp_save_profile_fields( $user_id ) {

        if ( !current_user_can( 'administrator', $user_id ) )
            return false;

        update_usermeta( $user_id, 'portal_cat', $_POST['portal_cat'] );
    }
}
maheshwaghmare
quelle
2

Ich Problemumgehung ist verfügbar, indem Sie das verwenden, user_new_form_tagdas sich in dem user-new.phpFormularstarttag der Seite befindet. Wenn Sie anschließend HTML ausgeben, müssen Sie am Ende nur mit der Ausgabe beginnen >und den zuletzt ausgegebenen >eigenen Code entfernen . Wie in:

function add_new_field_to_useradd()
{
    echo "><div>"; // Note the first '>' here. We wrap our own output to a 'div' element.

    // Your wanted output code should be here here.

    echo "</div"; // Note the missing '>' here.
}

add_action( "user_new_form_tag", "add_new_field_to_useradd" );

Die user_new_form_tagbefindet sich in der user-new.phpNähe von Zeile 303 (mindestens in WP3.5.1):

...
<p><?php _e('Create a brand new user and add it to this site.'); ?></p>
<form action="" method="post" name="createuser" id="createuser" class="validate"<?php do_action('user_new_form_tag');?>>
<input name="action" type="hidden" value="createuser" />
...

Der Nachteil hierbei ist natürlich, dass alle benutzerdefinierten Felder zuerst im Formular angezeigt werden müssen, bevor die in WP Core deklarierten Felder angezeigt werden.

ojrask
quelle
2

Die Haken sind wichtig, egal wie wir Formularfelder innerhalb der Funktion sortieren. Folgen Sie meinen Inline-Kommentaren. Ab WordPress 4.2.2 haben wir jetzt viele Hooks:

<?php
/**
 * Declaring the form fields
 */
function show_my_fields( $user ) {
   $fetched_field = get_user_meta( $user->ID, 'my_field', true ); ?>
    <tr class="form-field">
       <th scope="row"><label for="my-field"><?php _e('Field Name') ?> </label></th>
       <td><input name="my_field" type="text" id="my-field" value="<?php echo esc_attr($fetched_field); ?>" /></td>
    </tr>
<?php
}
add_action( 'show_user_profile', 'show_my_fields' ); //show in my profile.php page
add_action( 'edit_user_profile', 'show_my_fields' ); //show in my profile.php page

//add_action( 'user_new_form_tag', 'show_my_fields' ); //to add the fields before the user-new.php form
add_action( 'user_new_form', 'show_my_fields' ); //to add the fields after the user-new.php form

/**
 * Saving my form fields
 */
function save_my_form_fields( $user_id ) {
    update_user_meta( $user_id, 'my_field', $_POST['my_field'] );
}
add_action( 'personal_options_update', 'save_my_form_fields' ); //for profile page update
add_action( 'edit_user_profile_update', 'save_my_form_fields' ); //for profile page update

add_action( 'user_register', 'save_my_form_fields' ); //for user-new.php page new user addition
Mayeenul Islam
quelle
1

user_contactmethodsDer Filter-Hook wird auf der user-new.phpSeite nicht aufgerufen, sodass er nicht funktioniert. Wenn Sie sich die Quelle ansehen, werden Sie feststellen, dass es keinen Hook gibt, mit dem Sie dem Formular zum Hinzufügen neuer Benutzer zusätzliche Felder hinzufügen können.

Dies kann also nur durch Ändern der Kerndateien (BIG NO NO) oder Hinzufügen der Felder mit JavaScript oder jQuery und Abfangen der Felder erfolgen.

oder Sie können ein Ticket im Trac erstellen

Bainternet
quelle
Leider musste ich user-new.php vorübergehend ändern, damit es funktioniert. Das ist ein nein nein. Aber hoffentlich ist es nur vorübergehend.
Zach Shallbetter
1

Der folgende Code zeigt "Biografische Informationen" im Formular "Benutzer hinzufügen" an


function display_bio_field() {
  echo "The field html";
}
add_action('user_new_form', 'display_bio_field');

Linish
quelle
Eine Antwort nur mit Code ist eine falsche Antwort. Versuchen Sie, verwandte Codex-Artikel zu verlinken und den Code hier zu erklären.
Mayeenul Islam
0

Dazu müssen Sie die user-new.php-Seite manuell ändern. Es ist nicht die richtige Art, damit umzugehen, aber wenn Sie dringend Hilfe benötigen, gehen Sie wie folgt vor.

Ich fügte hinzu

<tr class="form-field">
    <th scope="row"><label for="company_name"><?php _e('Company Name') ?> </label></th>
    <td><input name="company_name" type="text" id="company_name" value="<?php echo esc_attr($new_user_companyname); ?>" /></td>
</tr>

Ich habe die Informationen auch zu functions.php hinzugefügt

   function my_custom_userfields( $contactmethods ) {
    $contactmethods['company_name']             = 'Company Name';
    return $contactmethods;
   }
   add_filter('user_contactmethods','my_custom_userfields',10,1);
Zach Shallbetter
quelle
0

Dies funktioniert nicht für die Seite zum Hinzufügen neuer Benutzer. Wenn Sie dies jedoch auf der Seite "Ihr Profil" tun möchten (auf der Benutzer ihr Profil bearbeiten können), können Sie dies in functions.php versuchen:

add_action( 'show_user_profile', 'my_show_extra_profile_fields' );
add_action( 'edit_user_profile', 'my_show_extra_profile_fields' );
function my_show_extra_profile_fields( $user ) { ?>
    <h3>Extra profile information</h3>
    <table class="form-table">
        <tr>
            <th><label for="companyname">Company Name</label></th>
            <td>
                <input type="text" name="companyname" id="companyname" value="<?php echo esc_attr( get_the_author_meta( 'companyname', $user->ID ) ); ?>" class="regular-text" /><br />
                <span class="description">Where are you?</span>
            </td>
        </tr>
    </table>
<?php }
AndrettiMilas
quelle