เลือกสมาชิกในฐานะผู้เขียนโพสต์ในแผงการดูแลระบบ?


16

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

มีวิธีง่ายๆในการทำเช่นนี้โดยไม่ต้องเปลี่ยนบทบาทและความสามารถหรือไม่?

ขอบคุณ

คำตอบ:


17

นี่เป็นแฮ็คธรรมดาที่ฉันเขียนในสถานการณ์ที่คล้ายกัน มันจะแสดงทั้งหมดSubscribersในAuthorแบบเลื่อนลงในการแก้ไข / เพิ่มโพสต์ / หน้าจากที่คุณสามารถเลือกหนึ่งที่คุณต้องการ ฉันคิดว่ามันน่าจะเหมาะกับคุณ ...

add_filter('wp_dropdown_users', 'MySwitchUser');
function MySwitchUser($output)
{

    //global $post is available here, hence you can check for the post type here
    $users = get_users('role=subscriber');

    $output = "<select id=\"post_author_override\" name=\"post_author_override\" class=\"\">";

    //Leave the admin in the list
    $output .= "<option value=\"1\">Admin</option>";
    foreach($users as $user)
    {
        $sel = ($post->post_author == $user->ID)?"selected='selected'":'';
        $output .= '<option value="'.$user->ID.'"'.$sel.'>'.$user->user_login.'</option>';
    }
    $output .= "</select>";

    return $output;
}

เคล็ดลับเบื้องหลังสิ่งนี้คือหลังจากที่คุณส่งส่งหน้านี้ WP จะอ่านเฉพาะ $ user-> ID จากดรอปดาวน์นี้ในอาร์เรย์ $ _POST และกำหนดให้เป็นผู้เขียนโพสต์ และนั่นคือสิ่งที่คุณต้องการ!


ขอบคุณ Rutwick มาก! สิ่งที่ฉันต้องการ! ฉันแค่ต้องเปลี่ยนผู้ใช้ $ = get_users (); ไม่เช่นนั้นจะไม่แสดงผู้ใช้ที่มีบทบาทอื่นในนั้น
fxfuture

คุณยินดีต้อนรับเพื่อน! :) จริง ๆ แล้วฉันใช้มันสำหรับบทบาทที่กำหนดเองดังนั้นพารามิเตอร์ ... ดีใจที่ฉันสามารถช่วยได้!
Rutwick Gangurde

ฉันเพิ่งพบปัญหาเล็กน้อยเกี่ยวกับเรื่องนี้ - เมื่อฉันกลับไปที่หน้าแก้ไขโพสต์ค่าเริ่มต้นแบบเลื่อนลงของผู้ดูแลระบบดังนั้นถ้าฉันทำการเปลี่ยนแปลงและบันทึกโดยไม่ต้องเลือกผู้เขียนเรื่องนี้อีกครั้ง ความคิดวิธีการแก้ไขปัญหานี้?
fxfuture

ใช่คุณได้รับผู้เขียนสำหรับโพสต์นี้และตรวจสอบว่าผู้ใช้คนใดที่ตรงกับผู้แต่งเลือกตัวเลือกนั้น
Rutwick Gangurde

2
ลองพิมพ์global $postตัวแปร ...
Rutwick Gangurde

13

ในฐานะของ WordPress 4.4.0 ตอนนี้คุณสามารถใช้wp_dropdown_users_argsตัวกรอง ตอนนี้โค้ดง่ายขึ้นมาก:

add_filter( 'wp_dropdown_users_args', 'add_subscribers_to_dropdown', 10, 2 );
function add_subscribers_to_dropdown( $query_args, $r ) {

    $query_args['who'] = '';
    return $query_args;

}

3
นี่ควรเป็นคำตอบที่ถูกต้อง / เป็นที่ยอมรับ โดยตรงจาก Codex: developer.wordpress.org/reference/hooks/wp_dropdown_users_args/ …
AndyWarren

2

นี่เป็นวิธีการที่คล้ายกับ @brasofilo แต่ใช้งานได้เฉพาะในหน้าจอแก้ไขโพสต์แทนที่จะแก้ไขอย่างรวดเร็วและรวมถึงผู้ใช้ทั้งหมด (ไม่ใช่เฉพาะผู้เขียนและสมาชิก)

/* Remove Author meta box from post editing */
function wpse50827_author_metabox_remove() {
    remove_meta_box('authordiv', 'post', 'normal');
}
add_action('admin_menu', 'wpse50827_author_metabox_remove');


/* Replace with custom Author meta box */
function wpse39084_custom_author_metabox() {  
    add_meta_box( 'authordiv', __('Author'), 'wpse39084_custom_author_metabox_insdes','post');  
 } 
add_action( 'add_meta_boxes', 'wpse39084_custom_author_metabox');  


/* Include all users in post author dropdown*/
/* Mimics the default metabox http://core.trac.wordpress.org/browser/trunk/wp-admin/includes/meta-boxes.php#L514 */
function wpse39084_custom_author_metabox_insdes() {
      global $user_ID;
      global $post;
      ?>
      <label class="screen-reader-text" for="post_author_override"><?php _e('Author'); ?></label>

      <?php
        wp_dropdown_users( array(
             'name' => 'post_author_override',
             'selected' => empty($post->ID) ? $user_ID : $post->post_author,
             'include_selected' => true
        ) );
}

นี่เป็นการเลียนแบบผู้เขียนเริ่มต้น metaboxแต่การโทรwp_dropdown_usersละเว้นการwho=>'editors'โต้แย้ง มันเริ่มต้นที่ค่าอื่น ๆ เท่านั้นซึ่งเป็นผู้ใช้โทร


ขอบคุณสตีเฟ่น ฉันสิ้นสุดขึ้นโดยใช้วิธีการแก้ปัญหาของ Rutwick เพราะมันทำงานแล้วกับ CPTs แต่ขอบคุณคำตอบของคุณ :)
fxfuture

เพิ่มโพสต์ทั่วโลก $; ไปยังฟังก์ชั่นจริงเพราะมันไม่ได้รับผู้แต่งที่มีอยู่เมื่อฉันแก้ไขโพสต์ แต่มันเอาฉันเป็นผู้เขียนโพสต์เสมอ Annyoing มาก
danieldekay

1

วิธีที่ดีกว่าที่จะทำ ...

add_filter('wp_dropdown_users', 'MySwitchUser');
function MySwitchUser()
{
    global $post; // remove if not needed
    //global $post is available here, hence you can check for the post type here
    $users = get_users('role=subscriber');

    echo'<select id="post_author_override" name="post_author_override" class="">';

    echo'<option value="1">Admin</option>';

    foreach($users as $user)
    {
        echo '<option value="'.$user->ID.'"';

        if ($post->post_author == $user->ID){ echo 'selected="selected"'; }

        echo'>';
        echo $user->user_login.'</option>';     
    }
    echo'</select>';

}

ใช้งานไม่ได้สำหรับฉัน: แนะนำให้บัญชีผู้ดูแลระบบเป็นผู้เขียนโพสต์ใหม่ซึ่งทำให้ผู้ใช้อัปเดตโพสต์ได้ยากมาก (จากนั้นสูญเสียสิทธิ์ในการแก้ไขโดยอัตโนมัติ)
danieldekay

1

นี่คือรหัสที่เชื่อมโยงโดย @Innate ในความคิดเห็น (โซลูชัน) กับคำถามของเขาฉันเพิ่งปรับตัวเล็กน้อยและทดสอบใน WP 3.3.2 (ฟังก์ชั่น wpse39084) มันจะแสดงสมาชิกในโพสต์แก้ไขและแก้ไขด่วน

เพิ่มการกระทำสองสามอย่าง (ฟังก์ชั่น wpse50827) เพื่อย้ายกล่องเมตาผู้เขียนภายในกล่องเมตาเผยแพร่ของ Actions เพื่อให้การจัดการง่ายขึ้น

ทุกอย่างเกี่ยวข้องกับการโพสต์ไม่มีหน้าหรือ CPT ...

foreach( array( 'edit.php', 'post.php' ) as $hook )
    add_action( "load-$hook", 'wpse39084_replace_post_meta_author' );       

/* Show Subscribers in post author dropdowns - edit and quickEdit */
function wpse39084_replace_post_meta_author()
{
    global $typenow;
    if( 'post' != $typenow )
        return;

    add_action( 'admin_menu', 'wpse50827_author_metabox_remove' );
    add_action( 'post_submitbox_misc_actions', 'wpse50827_author_metabox_move' );
    add_filter( 'wp_dropdown_users', 'wpse39084_showme_dropdown_users' );
}

/* Modify authors dropdown */
function wpse39084_showme_dropdown_users( $args = '' )
{
    $post = get_post();
    $selected = $post->post_author;
    $siteusers = get_users( 'orderby=nicename&order=ASC' ); // you can pass filters and option
    $re = '';
    if( count( $siteusers ) > 0 )
    {
        $re = '<select name="post_author_override" id="post_author_override">';
        foreach( $siteusers as $user )
        {
            $re .= '<option value="' . $user->ID . '">' . $user->user_nicename . '</option>';
        }
        $re .= '</select>';
        $re = str_replace( 'value="' . $selected . '"', 'value="' . $selected . '" selected="selected"', $re );
    }
    echo $re;
}

/* Remove Author meta box from post editing */
function wpse50827_author_metabox_remove()
{
    remove_meta_box( 'authordiv', 'post', 'normal' );
}


/* Move Author meta box inside Publish Actions meta box */
function wpse50827_author_metabox_move()
{
    global $post;

    echo '<div id="author" class="misc-pub-section" style="border-top-style:solid; border-top-width:1px; border-top-color:#EEEEEE; border-bottom-width:0px;">Author: ';
    post_author_meta_box( $post );
    echo '</div>';
}

1
ขอบคุณ brasofilo ฉันสิ้นสุดขึ้นโดยใช้วิธีการแก้ปัญหาของ Rutwick เพราะมันทำงานแล้วกับ CPTs แต่ขอบคุณคำตอบของคุณ :)
fxfuture

0

ฉันทำบางสิ่งที่คล้ายกับคำตอบที่ยอมรับได้ที่นี่ แต่ต้องการแสดงผู้ดูแลเท่านั้นและในกรณีของฉันคือบทบาท 'ผู้สร้าง' ที่กำหนดเองร่วมกัน

add_filter('wp_dropdown_users', 'custom_author_select');
function custom_author_select($output){

    //global $post is available here, hence you can check for the post type here
    $admins = get_users('role=administrator');
    $producers = get_users('role=producer');
    $users = array_merge($admins, $producers);

    $output = "<select id=\"post_author_override\" name=\"post_author_override\" class=\"\">";

    //Leave the admin in the list
    $output .= "<option value=\"1\">Admin</option>";

    foreach($users as $user){
        $sel = ($post->post_author == $user->ID)?"selected='selected'":'';
        $output .= '<option value="'.$user->ID.'"'.$sel.'>'.$user->user_login.'</option>';
    }

    $output .= "</select>";

    return $output;
}

0

นี่อาจเป็นวิธีการแก้ไขข้อผิดพลาดในการแก้ไขอย่างรวดเร็วโดยที่ "cpt_slug" ควรถูกแทนที่ด้วยกระสุนชนิดโพสต์ที่กำหนดเองของคุณ

add_filter('wp_dropdown_users', 'MySwitchUser');

function MySwitchUser($output)
{
    global $typenow;
if ((is_edit_page('edit') && "cpt_slug" == $typenow)||(is_edit_page('new') && "cpt_slug" == $typenow)){
    global $post;
    $users = get_users();
    $output = "<select id=\"post_author_override\" name=\"post_author_override\" class=\"\">";   
    foreach($users as $user)
    {
        $sel = ($post->post_author == $user->ID)?"selected='selected'":'';
        $output .= '<option value="'.$user->ID.'"'.$sel.'>'.$user->user_login.'</option>';
    }
    $output .= "</select>";   
} 
return $output;
}



function is_edit_page($new_edit = null){
    global $pagenow;
    if (!is_admin()) return false;
    if($new_edit == "edit")
        return in_array( $pagenow, array( 'post.php',  ) );
    elseif($new_edit == "new") 
        return in_array( $pagenow, array( 'post-new.php' ) );
    else 
        return in_array( $pagenow, array( 'post.php', 'post-new.php' ) );
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.