在管理面板中选择订阅者作为帖子的作者?

时间:2012-05-02 作者:fxfuture

我想能够在管理员中选择一个订阅者,一个帖子的作者,这样它会显示他们写过帖子的名字,但我不想给他们任何额外的特权(如果他们登录时唯一可以访问的是他们的个人资料)。

有没有一种简单的方法可以做到这一点,而不必更改角色和功能?

谢谢

7 个回复
最合适的回答,由SO网友:Rutwick Gangurde 整理而成

这是我在类似情况下编写的一个简单的黑客程序。它将显示所有SubscribersAuthor “编辑/添加帖子/页面”上的下拉列表,您可以从中选择任何想要的帖子。我想它应该对你有用。。。

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只会从$\\u POST数组中的下拉列表中读取$user->ID,并将其指定为posts作者。这就是你想要的!

SO网友:jg314

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

}

SO网友:Stephen Harris

这与@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
        ) );
}
这模仿了default author metabox 但是电话wp_dropdown_users 省略who=>\'editors\' 论点它默认为唯一的其他值,即call users。

SO网友:brasofilo

这是一个code linked 通过@先天性地对自己的问题进行评论(解决方案),我只做了一点修改,并在WP 3.3.2(功能wpse39084)中进行了测试。它将在Post Edit和Quick Edit中显示订阅者。

还添加了两个操作(函数wpse50827),将Author元框移动到Publish 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>\';
}

SO网友:Andru-1983

一个更好的方法。。。

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

}

SO网友:D3XT3R

我在这里做了一些类似于公认答案的事情,但我只想展示管理员,在我的情况下,一个定制的“制作人”角色。

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

SO网友:Marcello Magi Spinetti

这可能是一种避免快速编辑错误的解决方案,其中“cpt\\U slug”应替换为自定义的post类型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\' ) );
}

结束