Выберите подписчика в качестве автора сообщения в панели администратора?

Я хочу, чтобы у вас был возможность выбрать подписчика автора сообщения в админе, чтобы он отображал свое имя как написанное, но я не хочу давать им какие-либо дополнительные привилегии (если они заходят в систему, единственное, к чему они могут обратиться, их профиль).

Есть ли простой способ сделать это без необходимости менять роли и возможности?

благодаря

Solutions Collecting From Web of "Выберите подписчика в качестве автора сообщения в панели администратора?"

Это простой взлом, который я написал в подобной ситуации. Он отобразит все 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 и присваивает его в качестве автора сообщений. И это то, чего ты хочешь!

Начиная с 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; } 

Это аналогичный подход к @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_users опускает wp_dropdown_users who=>'editors' . По умолчанию используется только другое значение, которое является вызовом пользователей.

Лучший способ сделать это …

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

Это код, связанный с @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>'; } 

Я сделал что-то похожее на принятый ответ здесь, но только хотел показать администраторам и, в моем случае, индивидуальную «продюсерскую» роль вместе.

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

Это может быть решением, позволяющим избежать ошибки при быстром редактировании, где «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' ) ); }