Chọn thuê bao là tác giả của bài đăng trong bảng quản trị?


16

Tôi muốn có thể chọn một người đăng ký một tác giả của một bài đăng trong quản trị viên để nó hiển thị tên của họ như đã viết bài đăng, nhưng tôi không muốn cung cấp cho họ bất kỳ đặc quyền bổ sung nào (nếu họ đăng nhập điều duy nhất họ có thể truy cập là hồ sơ của họ).

Có một cách đơn giản để làm điều này mà không phải thay đổi vai trò và khả năng?

Cảm ơn

Câu trả lời:


17

Đây là một hack đơn giản tôi đã viết trong một tình huống tương tự. Nó sẽ hiển thị tất cảSubscribers trong Authordanh sách thả xuống khi chỉnh sửa / thêm bài đăng / trang, từ đó bạn có thể chọn bất kỳ cái nào bạn muốn. Tôi nghĩ rằng nó sẽ làm việc cho bạn ...

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

Thủ thuật đằng sau điều này là, sau khi bạn gửi trang này, WP chỉ đọc $ user-> ID từ danh sách này thả xuống trong mảng $ _POST và gán nó làm tác giả bài viết. Và đó là những gì bạn muốn!


Cảm ơn rất nhiều! Chính xác những gì tôi cần! Tôi chỉ phải thay đổi $ users = get_users (); mặt khác, nó không hiển thị người dùng với các vai trò khác trong đó
fxfuture

Bạn được chào đón bạn đời! :) Trên thực tế tôi đã sử dụng nó cho một vai trò tùy chỉnh, do đó các tham số ... Vui mừng tôi có thể giúp!
Rutwick Gangurde

Tôi vừa tìm thấy một vấn đề nhỏ với vấn đề này - khi tôi xem lại trang chỉnh sửa bài đăng, mặc định thả xuống cho quản trị viên, vì vậy nếu tôi thay đổi và lưu mà không chọn lại tác giả thì điều này sẽ thay đổi tác giả thành quản trị viên. Bất kỳ ý tưởng làm thế nào để khắc phục điều này?
fxfuture

Có, bạn nhận được tác giả cho bài đăng này và kiểm tra xem một trong những người dùng phù hợp với tác giả, giữ tùy chọn đó được chọn.
Rutwick Gangurde

2
Hãy thử in global $postbiến ...
Rutwick Gangurde

13

Kể từ WordPress 4.4.0, giờ bạn có thể sử dụng wp_dropdown_users_argsbộ lọc. Mã bây giờ đơn giản hơn nhiều:

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
Đây phải là câu trả lời đúng / được chấp nhận. Trực tiếp từ Codex: developer.wordpress.org/reference/hooks/wp_dropdown_usftimeargs/
gợi

2

Đây là cách tiếp cận tương tự với @brasofilo. Nhưng chỉ hoạt động trong màn hình chỉnh sửa bài, thay vì chỉnh sửa nhanh và bao gồm tất cả người dùng (không chỉ tác giả và người đăng ký).

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

Điều này bắt chước metabox tác giả mặc định nhưng cuộc gọi wp_dropdown_usersbỏ qua who=>'editors'đối số. Nó mặc định chỉ có giá trị khác là người dùng gọi.


Cảm ơn Stephen. Tôi đã kết thúc bằng cách sử dụng giải pháp của Rutwick vì nó đã hoạt động với CPT nhưng đánh giá cao câu trả lời của bạn :)
fxfuture

thêm bài toàn cầu $; đến chức năng thực tế vì nó không chọn tác giả hiện có khi tôi chỉnh sửa bài đăng, nhưng nó luôn đưa tôi trở thành tác giả bài viết. Rất Anny tiến.
danieldekay

1

Một cách tốt hơn để làm điều đó ...

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

}

không phù hợp với tôi: nó luôn đề xuất tài khoản Admin trở thành tác giả mới của bài đăng, điều này khiến người dùng rất khó cập nhật bài đăng (và sau đó tự động mất quyền chỉnh sửa).
danieldekay

1

Đây là một mã được liên kết bởi @Innate trong một nhận xét (giải pháp) cho câu hỏi của riêng anh ấy, tôi chỉ cần điều chỉnh một chút và thử nghiệm trong WP 3.3.2 (chức năng wpse39084). Nó sẽ hiển thị những người đăng ký trong bài viết Chỉnh sửa và Chỉnh sửa nhanh.

Đồng thời thêm một vài hành động (chức năng wpse50827) để di chuyển hộp meta Tác giả bên trong hộp meta Hành động Xuất bản, để quản lý dễ dàng hơn.

Mọi thứ đều liên quan đến bài đăng, không có trang nào cũng như 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
Cảm ơn brasofilo. Tôi đã kết thúc bằng cách sử dụng giải pháp của Rutwick vì nó đã hoạt động với CPT nhưng đánh giá cao câu trả lời của bạn :)
fxfuture

0

Tôi đã làm một cái gì đó tương tự như câu trả lời được chấp nhận ở đây nhưng chỉ muốn hiển thị quản trị viên và trong trường hợp của tôi, vai trò 'nhà sản xuất' tùy chỉnh cùng nhau.

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

Đây có thể là một giải pháp để tránh lỗi trong chỉnh sửa nhanh, trong đó "cpt_slug" nên được thay thế bằng sên loại bài đăng tùy chỉnh của bạn

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' ) );
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.