Selectare abonat ca autor al postării în panoul de administrare?
Doresc să pot selecta un abonat ca autor al unei postări în panoul de administrare, astfel încât numele său să apară ca autor, dar nu vreau să-i acord permisiuni suplimentare (dacă se autentifică, singurul lucru la care poate accesa este profilul său).
Există o metodă simplă de a face acest lucru fără a fi nevoie să modific rolurile și capabilitățile?
Mulțumesc

Acesta este un hack simplu pe care l-am scris într-o situație similară. Va afișa toți Abonații
în meniul derulant Autor
din pagina de editare/adaugare articol/pagină, de unde poți selecta pe cine dorești. Cred că ar trebui să funcționeze și pentru tine...
add_filter('wp_dropdown_users', 'MySwitchUser');
function MySwitchUser($output)
{
//global $post este disponibil aici, deci poți verifica tipul postului
$users = get_users('role=subscriber');
$output = "<select id=\"post_author_override\" name=\"post_author_override\" class=\"\">";
//Păstrează administratorul în 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;
}
Smecheria din spatele acestui hack este că după ce trimiți pagina, WordPress citește doar $user->ID din acest meniu derulant în array-ul $_POST și îl atribuie ca autor al postului. Și exact asta dorești!

Mulțumesc mult Rutwick! Exact ce aveam nevoie! A trebuit doar să schimb $users = get_users(); altfel nu afișa utilizatorii cu alte roluri acolo

Cu plăcere prietene! :) De fapt, eu îl foloseam pentru un rol personalizat, de aceea parametrii... Mă bucur că am putut ajuta!

Tocmai am descoperit o mică problemă cu asta - când revin pe pagina de editare a postului, meniul drop down revine implicit la admin, așa că dacă fac modificări și salvez fără să selectez din nou autorul, acesta se schimbă în admin. Ai idee cum să rezolv asta?

Da, obții autorul pentru acest articol și verifici care dintre utilizatori se potrivește cu autorul, păstrând acea opțiune selectată.

Din anumite motive, $post->post_author nu returnează nimic în ecranul meu de editare a articolului și nu înțeleg de ce!

Rețineți că ID-ul utilizatorului 1
poate fi sau nu un administrator. Obținerea unui administrator real din WordPress ar funcționa.

Am făcut câteva ajustări minore la această soluție, în cazul în care cineva are nevoie.Așadar, dacă doriți să afișați "numele de afișare" în meniul derulant, schimbați doar a doua linie din foreach în acest fel: $output .= '<option value="'.$user->ID.'"'.$sel.'>'.$user->display_name.'</option>'; Și dacă doriți să adăugați un utilizator specific (cu un rol diferit), adăugați această linie înainte de foreach: $output .= "<option value=\"[ID]\">Nume</option>"; (înlocuiți [ID] cu ID-ul real)

Începând cu WordPress 4.4.0, acum poți utiliza filtrul wp_dropdown_users_args
. Codul este mult mai simplu acum:
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;
}

Acesta ar trebui să fie răspunsul corect/acceptat. Direct din Codex: https://developer.wordpress.org/reference/hooks/wp_dropdown_users_args/#user-contributed-notes

Aceasta este o abordare similară cu cea a lui @brasofilo. Dar funcționează doar în ecranul de editare a articolului, nu în editarea rapidă, și include toți utilizatorii (nu doar autorii și abonații).
/* Elimină caseta meta Autor din editarea articolului */
function wpse50827_author_metabox_remove() {
remove_meta_box('authordiv', 'post', 'normal');
}
add_action('admin_menu', 'wpse50827_author_metabox_remove');
/* Înlocuiește cu caseta meta Autor personalizată */
function wpse39084_custom_author_metabox() {
add_meta_box( 'authordiv', __('Autor'), 'wpse39084_custom_author_metabox_insdes','post');
}
add_action( 'add_meta_boxes', 'wpse39084_custom_author_metabox');
/* Include toți utilizatorii în meniul derulant al autorului articolului */
/* Imită caseta meta implicită 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('Autor'); ?></label>
<?php
wp_dropdown_users( array(
'name' => 'post_author_override',
'selected' => empty($post->ID) ? $user_ID : $post->post_author,
'include_selected' => true
) );
}
Aceasta imită caseta meta Autor implicită, dar apelul wp_dropdown_users
omite argumentul who=>'editori'
. În mod implicit, utilizează singura altă valoare disponibilă, care este apelarea tuturor utilizatorilor.

Mulțumesc Stephen. Am ales în final soluția lui Rutwick pentru că funcționează deja cu CPT-uri, dar apreciez răspunsul tău :)

Acesta este un cod legat de @Innate într-un comentariu (soluție) la propria întrebare, l-am adaptat puțin și testat în WP 3.3.2 (funcția wpse39084). Va afișa abonații în editarea și editarea rapidă a articolelor.
De asemenea, am adăugat câteva acțiuni (funcții wpse50827) pentru a muta caseta meta Autor în interiorul casetei meta Acțiuni de Publicare, pentru o gestionare mai ușoară.
Totul este legat de articole, nu de pagini sau tipuri personalizate de postări...
foreach( array( 'edit.php', 'post.php' ) as $hook )
add_action( "load-$hook", 'wpse39084_replace_post_meta_author' );
/* Afișează Abonați în meniurile derulante ale autorului - editare și editare rapidă */
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' );
}
/* Modifică meniul derulant al autorilor */
function wpse39084_showme_dropdown_users( $args = '' )
{
$post = get_post();
$selected = $post->post_author;
$siteusers = get_users( 'orderby=nicename&order=ASC' ); // poți transmite filtre și opțiuni
$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;
}
/* Elimină caseta meta Autor din editarea articolelor */
function wpse50827_author_metabox_remove()
{
remove_meta_box( 'authordiv', 'post', 'normal' );
}
/* Mută caseta meta Autor în interiorul casetei meta Acțiuni de Publicare */
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;">Autor: ';
post_author_meta_box( $post );
echo '</div>';
}

O metodă mai bună de a face asta...
add_filter('wp_dropdown_users', 'MySwitchUser');
function MySwitchUser()
{
global $post; // elimină dacă nu este necesar
// global $post este disponibil aici, deci poți verifica tipul postării aici
$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>';
}

Am făcut ceva similar cu răspunsul acceptat aici, dar am vrut să afișez doar administratorii și, în cazul meu, un rol personalizat de 'producători', împreună.
add_filter('wp_dropdown_users', 'custom_author_select');
function custom_author_select($output){
// variabila globală $post este disponibilă aici, deci poți verifica tipul postului
$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=\"\">";
// Păstrează administratorul în 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;
}

Aceasta ar putea fi o soluție pentru a evita eroarea la editarea rapidă, unde "cpt_slug" trebuie înlocuit cu slug-ul tipului tău de postare personalizat
// Adăugăm filtrul pentru dropdown-ul de utilizatori
add_filter('wp_dropdown_users', 'MySwitchUser');
function MySwitchUser($output)
{
global $typenow;
// Verificăm dacă suntem pe pagina de editare sau creare și dacă tipul postării este cel dorit
if ((is_edit_page('edit') && "cpt_slug" == $typenow)||(is_edit_page('new') && "cpt_slug" == $typenow)){
global $post;
// Obținem toți utilizatorii
$users = get_users();
$output = "<select id=\"post_author_override\" name=\"post_author_override\" class=\"\">";
foreach($users as $user)
{
// Selectăm utilizatorul curent al postării
$sel = ($post->post_author == $user->ID)?"selected='selected'":'';
$output .= '<option value="'.$user->ID.'"'.$sel.'>'.$user->user_login.'</option>';
}
$output .= "</select>";
}
return $output;
}
// Funcție pentru a verifica tipul paginii de editare
function is_edit_page($new_edit = null){
global $pagenow;
// Verificăm dacă suntem în admin
if (!is_admin()) return false;
// Verificăm dacă suntem pe pagina de editare
if($new_edit == "edit")
return in_array( $pagenow, array( 'post.php', ) );
// Verificăm dacă suntem pe pagina de creare
elseif($new_edit == "new")
return in_array( $pagenow, array( 'post-new.php' ) );
// Verificăm ambele cazuri
else
return in_array( $pagenow, array( 'post.php', 'post-new.php' ) );
}

Este un pic haotic. Se pare că există 3 abordări posibile, în funcție de faptul că folosiți Editorul Clasic sau Gutenberg.
Dacă folosiți Editorul Clasic:
- Puteți suprascrie HTML-ul folosind filtrul
wp_dropdown_users
cum au sugerat și alte răspunsuri - Sau puteți suprascrie parametrii interogării folosind
wp_dropdown_users_args
Dacă folosiți Gutenberg, meniul derulant cu Autori este implementat diferit.
După cum a menționat Thomas Levy în această problemă pe GitHub:
- Funcția din editorul pe blocuri folosită pentru a popula meniul derulant cu autori este wodpress/data/select( ‘core’ ).getAuthors()
- Aceasta apelează endpoint-ul API REST: /wp/v2/users/?who=authors&per_page=-1
- Acest endpoint API transmite date către WP_User_Query
- O interogare WP_User_Query cu parametrul "who=>author" va adăuga o interogare usermeta în mix.
- Aceasta va extrage orice utilizator cu user_level diferit de 0
Pentru ca rolul personalizat să apară în meniul derulant cu autori, trebuie să adăugați capabilitatea level_1
rolului. Nivelurile au fost înlocuite cu capabilități în WordPress 2.0 încă din 2005, dar acest comportament/bug a rămas până acum.
$role = add_role( 'mycustomrole', 'Rolul Meu Personalizat' );
$role->add_cap( 'level_1' );
Pentru a adăuga această capabilitate utilizatorilor existenți, rulați acest cod o singură dată:
$custom_role = get_users( 'role=mycustomrole' );
foreach ( $custom_role as $role ) {
$role->add_cap( 'level_1' );
}

Am încercat toate soluțiile de aici și altele, dar aceasta din notele utilizatorilor contribuitori din Wordpress Codex a fost singura care a funcționat pentru mine.
Se spune că trebuie să dai drepturi abonaților să o folosească, dar în cazul meu, nu am vrut asta. Voiam doar să pot să-i selectez în caseta de selectare a autorilor.
// Afișează Abonații în meniul drop-down 'autor' din editorul clasic de postări
function wpdocs_add_subscribers_to_dropdown( $query_args ) {
$query_args['who'] = ''; // resetează interogarea
$query_args['capability'] = ''; // resetează interogarea
$query_args['role__in'] = array( 'administrator', 'subscriber', 'author', 'editor' );
$query_args['capability__in'] = array( 'edit_own_posts' ); // Drept personalizat pentru abonați
return $query_args;
}
add_filter( 'wp_dropdown_users_args', 'wpdocs_add_subscribers_to_dropdown' );
Linkul către pagina codex: https://developer.wordpress.org/reference/hooks/wp_dropdown_users_args/#user-contributed-notes
