การเพิ่มฟิลด์ลงในหน้าจอ“ เพิ่มผู้ใช้ใหม่” ในแดชบอร์ด


13

ฉันต้องการเพิ่มฟิลด์ "ชื่อ บริษัท " ในหน้าเพิ่มผู้ใช้ใหม่ในแผงการดูแลระบบ ฉันได้ทำการค้นหาค่อนข้างน้อยและไม่สามารถหารายละเอียดเกี่ยวกับวิธีการทำเช่นนี้ได้ ฉันสามารถเพิ่มข้อมูลลงในหน้าโปรไฟล์และลงทะเบียนด้วย ..

   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);

แต่ไม่มีลูกเต๋าในสิ่งอื่นใด


คุณสามารถใช้ปลั๊กอิน ACF (ฟิลด์ที่กำหนดเองขั้นสูง)เพื่อใช้คุณสมบัตินี้
Linish

คำตอบ:


17

user_new_form คือตะขอที่สามารถทำเวทย์มนตร์ได้ที่นี่

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');

สำหรับรายละเอียดเพิ่มเติมเยี่ยมชมโพสต์บล็อกของฉัน: http://scriptbaker.com/adding-custom-fields-to-wordpress-user-profile-and-add-new-user-page/


13

ฉันมีความต้องการแบบเดียวกันและสร้างแฮ็คต่อไปนี้:

<?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');

3
ตอนนี้เรากำลังรอคำอธิบายของคุณ
fuxia

ฉันเห็นซอร์สโค้ดในไฟล์ user-new.php e ไม่มี hook action เหมือน "add_user_profile" ดังนั้นฉันจึงจำลองสิ่งนี้ด้วยการกระทำ "admin_footer_text" และกรองตาม $ pagenow == "user-new.php" ตอนนี้ฉันแสดงความคิดเห็นแฮ็คเพื่ออธิบายรหัส
NkR

3
ทำไมคุณไม่ใช้user_new_formการกระทำ?
itsazzad

@SazzadTusharKhan tx สำหรับตัวชี้
alex

3

คุณต้องทำ 2 สิ่ง

  1. ลงทะเบียนช่อง
  2. บันทึกเขตข้อมูล

หมายเหตุ:ตัวอย่างด้านล่างadministratorใช้สำหรับบทบาทผู้ใช้เท่านั้น


1. ลงทะเบียนช่อง

สำหรับการเพิ่มผู้ใช้ใหม่ใช้การกระทำuser_new_form

สำหรับผู้ใช้รายละเอียดการดำเนินการการใช้งานshow_user_profile,edit_user_profile

ลงทะเบียนข้อมูลตัวอย่าง:

/**
 * 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. บันทึกฟิลด์

สำหรับการเพิ่มผู้ใช้ใหม่ใช้การกระทำuser_register

สำหรับผู้ใช้รายละเอียดการดำเนินการการใช้งานpersonal_options_update,edit_user_profile_update

บันทึกส่วนย่อย:

/**
 *  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'] );
    }
}

ทำข้อมูลโค้ดให้สมบูรณ์:

/**
 * 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'] );
    }
}

2

วิธีแก้ปัญหาผมสามารถใช้ได้โดยใช้user_new_form_tagที่อยู่ภายในuser-new.phpรูปแบบเริ่มต้นแท็กหน้า ในที่สุดแล้วถ้าคุณเอาท์พุท HTML หลังจากนั้นคุณเพียงแค่ต้องเริ่มต้นผลลัพธ์ด้วย>และลบผลลัพธ์สุดท้าย>ของรหัสของคุณเอง ในขณะที่:

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" );

user_new_form_tagตั้งอยู่ในuser-new.phpบริเวณเส้น 303 (ใน 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" />
...

แน่นอนข้อเสียที่นี่คือฟิลด์ที่กำหนดเองทั้งหมดของคุณจะต้องปรากฏขึ้นเป็นลำดับแรกในแบบฟอร์มก่อนที่ฟิลด์ที่ประกาศใน WP core


2

hooks มีความสำคัญไม่ว่าเราจะเรียงลำดับเขตข้อมูลฟอร์มภายในฟังก์ชันอย่างไร ติดตามความคิดเห็นแบบอินไลน์ของฉัน ในฐานะของ WordPress 4.2.2 เรามีตะขอมากมายตอนนี้:

<?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

1

user_contactmethodsตัวกรอง hook จะไม่ถูกเรียกที่user-new.phpหน้าเว็บเพื่อที่จะไม่ทำงานและเศร้าถ้าคุณดูที่แหล่งที่มาคุณจะเห็นว่าไม่มีตะขอที่สามารถใช้เพื่อเพิ่มเขตข้อมูลพิเศษลงในแบบฟอร์มผู้ใช้ใหม่เพิ่ม

ดังนั้นสิ่งนี้สามารถทำได้โดยการแก้ไขไฟล์หลัก (ไม่มีใหญ่) หรือเพิ่มฟิลด์โดยใช้ JavaScript หรือ jQuery และจับฟิลด์

หรือคุณสามารถสร้างตั๋วได้ที่ Trac


น่าเสียดายที่เพื่อให้มันใช้งานได้ชั่วคราวฉันถูกบังคับให้แก้ไข user-new.php นี่คือไม่ไม่ แต่หวังว่ามันจะชั่วคราว
Zach Shallbetter

1

รหัสต่อไปนี้จะแสดง "ข้อมูลชีวประวัติ" ในฟอร์ม "เพิ่มผู้ใช้"


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


คำตอบรหัสเท่านั้นเป็นคำตอบที่ไม่ดี ลองเชื่อมโยงบทความ Codex ที่เกี่ยวข้องและอธิบายรหัสที่นี่
Mayeenul Islam

0

ในการทำเช่นนี้คุณจะต้องเปลี่ยนหน้า user-new.php ด้วยตนเอง มันไม่ใช่วิธีที่ถูกต้องในการจัดการ แต่ถ้าคุณต้องการความช่วยเหลืออย่างยิ่งนี่เป็นวิธีที่ทำได้

ฉันเพิ่ม

<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>

ฉันยังเพิ่มข้อมูลไปยัง functions.php

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

0

สิ่งนี้จะไม่ทำเพื่อเพิ่มหน้าผู้ใช้ใหม่ แต่ถ้าคุณต้องการให้มันเกิดขึ้นในหน้า "โปรไฟล์ของคุณ" (ที่ซึ่งผู้ใช้สามารถแก้ไขโปรไฟล์ของพวกเขา) จากนั้นคุณสามารถลองใช้งานได้ใน

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 }
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.