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


16

我希望能够在管理员中选择一个订阅者作为帖子的作者,以便将其姓名显示为已撰写该帖子,但是我不想赋予他们任何其他特权(如果他们登录,则他们唯一可以访问的权限是他们的个人资料)。

是否有一种简单的方法可以执行此操作而无需更改角色和功能?

谢谢

Answers:


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仅从$ _POST数组中的此下拉列表中读取$ user-> ID,并将其分配为帖子作者。这就是您想要的!


非常感谢Rutwick!正是我需要的!我只需要更改$ users = get_users(); 否则,它不会在其中显示具有其他角色的用户
fxfuture 2012年

欢迎您,队友!:)实际上,我将其用于自定义角色,因此使用了这些参数……很高兴可以为您提供帮助!
罗特威克·甘古德

我刚刚发现了一个小问题-当我重新访问帖子编辑页面时,下拉菜单默认为admin,因此,如果我进行更改并保存但未重新选择作者,则它将作者更改为admin。任何想法如何解决这个问题?
fxfuture 2012年

是的,您找到了该帖子的作者,然后检查哪个用户与该作者匹配,请保持选中该选项。
罗特威克·甘古德

2
尝试打印global $post变量...
Rutwick Gangurde


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的解决方案,因为它已经可以与CPT配合使用,但是感谢您的回答:)
fxfuture 2012年

增加了全局$ post; 到实际功能,因为当我编辑帖子时并没有接手现有的作者,但它始终使我成为帖子作者。非常令人讨厌。
danieldekay 2013年

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

1

这是一个代码链接通过@Innate在评论(解决方案),以他自己的问题,我刚刚适应一点点,在WP 3.3.2(功能wpse39084)进行测试。它将在帖子编辑和快速编辑中显示订阅者。

还添加了一些操作(功能wpse50827),以将“作者”元框移动到“发布操作”元框内,以便于管理。

一切都与帖子相关,没有页面也没有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的解决方案,因为它已经可以与CPT配合使用,但是感谢您的回答:)
fxfuture 2012年

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”替换为自定义帖子类型的“ 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' ) );
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.