관리자 패널에서 게시물 작성자로 구독자를 선택 하시겠습니까?


16

관리자에서 게시물 작성자를 구독자로 선택하여 게시물을 작성한 것으로 이름을 표시하고 싶지만 추가 권한을 부여하고 싶지 않습니다 (로그인하는 경우 액세스 가능한 유일한 것은 그들의 프로필).

역할과 기능을 변경하지 않고도이를 수행 할 수있는 간단한 방법이 있습니까?

감사

답변:


17

이것은 비슷한 상황에서 쓴 간단한 해킹입니다. 게시물 / 페이지 편집 / 추가 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는 $ _POST 배열의이 드롭 다운에서 $ user-> ID 만 읽고 게시물 작성자로 지정합니다. 그리고 그것이 당신이 원하는 것입니다!


너무 많은 Rutwick 감사합니다! 정확히 내가 필요한 것! 방금 $ users = get_users (); 그렇지 않으면 거기에 다른 역할을 가진 사용자를 표시하지 않았습니다
fxfuture

천만에요 친구 :) 실제로 나는 그것을 사용자 정의 역할에 사용하고 있었으므로 매개 변수는 ... 기쁘다.
Rutwick Gangurde

방금 사후 편집 페이지를 다시 방문하면 드롭 다운 기본값이 admin으로 변경되어 저자를 다시 선택하지 않고 저장하면 저자가 관리자로 변경됩니다. 이 문제를 해결하는 방법에 대한 아이디어가 있습니까?
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
        ) );
}

이것은 기본 작성자 메타 박스를 모방 하지만 호출 wp_dropdown_userswho=>'editors'인수를 생략합니다 . 기본값은 통화 사용자 인 유일한 다른 값입니다.


고마워 Stephen. 나는 이미 CPTS와 함께 작동하기 때문에 Rutwick의 솔루션을 사용하여 종료하지만 답변 : 감사
fxfuture을

글로벌 $ post 추가; 게시물을 편집 할 때 기존 작성자를 선택하지 않았기 때문에 실제 기능으로 이동했지만 항상 게시물 작성자로 데려갔습니다. 매우 열렬한.
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)을 추가했습니다.

모든 것은 게시물과 관련이 있으며 페이지 나 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. 나는 이미 CPTS와 함께 작동하기 때문에 Rutwick의 솔루션을 사용하여 종료하지만 답변 : 감사
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.