Selezionare un subscriber come autore di un post nel pannello admin?
Vorrei poter selezionare un subscriber come autore di un post nell'area di amministrazione, in modo che il loro nome appaia come autore del post, ma senza concedere ulteriori privilegi (se accedono, potranno vedere solo il loro profilo).
Esiste un modo semplice per farlo senza dover modificare ruoli e capacità?
Grazie

Questo è un semplice hack che ho scritto in una situazione simile. Mostrerà tutti gli Subscribers
nel menu a tendina Author
durante la modifica/aggiunta di un post/pagina, da dove potrai selezionare quello che desideri. Penso che funzionerà anche per te...
add_filter('wp_dropdown_users', 'MySwitchUser');
function MySwitchUser($output)
{
//global $post è disponibile qui, quindi puoi verificare il tipo di post
$users = get_users('role=subscriber');
$output = "<select id=\"post_author_override\" name=\"post_author_override\" class=\"\">";
//Mantieni l'amministratore nella lista
$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;
}
Il trucco qui è che, dopo aver inviato questa pagina, WP legge solo l'ID dell'utente ($user->ID) da questo menu a tendina nell'array $_POST, e lo assegna come autore del post. Ed è esattamente quello che vuoi!

Grazie mille Rutwick! Esattamente quello che mi serviva! Ho solo dovuto cambiare $users = get_users(); altrimenti non mostrava gli utenti con altri ruoli

Di nulla amico! :) In realtà lo stavo usando per un ruolo personalizzato, da qui i parametri... Felice di esserti stato utile!

Ho appena trovato un piccolo problema con questo - quando torno alla pagina di modifica del post il menu a tendina torna a impostare admin come default, quindi se faccio modifiche e salvo senza selezionare nuovamente l'autore, questo cambia l'autore in admin. Hai idea di come risolvere?

Sì, ottieni l'autore per questo post e verifica quale tra gli utenti corrisponde all'autore, mantenendo quella opzione selezionata.

Per qualche motivo $post->post_author non restituisce nulla nella mia schermata di modifica del post e non riesco a capire perché!

Nota che l'ID utente 1
potrebbe essere o meno un amministratore. Recuperare un vero amministratore da WordPress funzionerebbe.

Ho apportato alcune piccole modifiche a questa soluzione, nel caso qualcuno abbia bisogno. Quindi, se vuoi mostrare il "nome visualizzato" nel menu a discesa, cambia la seconda riga dentro foreach in questo: $output .= '<option value="'.$user->ID.'"'.$sel.'>'.$user->display_name.'</option>'; E se vuoi aggiungere un utente specifico (con un ruolo diverso), aggiungi questo prima di foreach: $output .= "<option value=\"[ID]\">Nome</option>"; (sostituisci [ID] con l'ID effettivo)

A partire da WordPress 4.4.0 puoi ora utilizzare il filtro wp_dropdown_users_args
. Il codice è molto più semplice ora:
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;
}

Questa dovrebbe essere la risposta corretta/accettata. Direttamente dal Codex: https://developer.wordpress.org/reference/hooks/wp_dropdown_users_args/#user-contributed-notes

Questo approccio è simile a quello di @brasofilo. Funziona però solo nella schermata di modifica del post, anziché nella modifica rapida, e include tutti gli utenti (non solo autori e iscritti).
/* Rimuovi il meta box Autore dalla modifica del post */
function wpse50827_author_metabox_remove() {
remove_meta_box('authordiv', 'post', 'normal');
}
add_action('admin_menu', 'wpse50827_author_metabox_remove');
/* Sostituisci con un meta box Autore personalizzato */
function wpse39084_custom_author_metabox() {
add_meta_box( 'authordiv', __('Autore'), 'wpse39084_custom_author_metabox_insdes','post');
}
add_action( 'add_meta_boxes', 'wpse39084_custom_author_metabox');
/* Includi tutti gli utenti nel menu a discesa dell'autore del post */
/* Emula il meta box predefinito 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('Autore'); ?></label>
<?php
wp_dropdown_users( array(
'name' => 'post_author_override',
'selected' => empty($post->ID) ? $user_ID : $post->post_author,
'include_selected' => true
) );
}
Questo emula il meta box autore predefinito ma la chiamata wp_dropdown_users
omette l'argomento who=>'editors'
. Di default utilizza l'unico altro valore disponibile che è tutti gli utenti.

Grazie Stephen. Alla fine ho usato la soluzione di Rutwick perché funziona già con i CPT, ma apprezzo la tua risposta :)

Questo è un codice linkato da @Innate in un commento (soluzione) alla sua stessa domanda, ho solo adattato leggermente e testato in WP 3.3.2 (funzione wpse39084). Mostrerà gli iscritti nei post Edit e Quick Edit.
Ho anche aggiunto un paio di azioni (funzioni wpse50827) per spostare il meta box Autore all'interno del meta box Azioni Pubblicazione, per una gestione più semplice.
Tutto è relativo ai post, non alle pagine né ai CPT...
foreach( array( 'edit.php', 'post.php' ) as $hook )
add_action( "load-$hook", 'wpse39084_replace_post_meta_author' );
/* Mostra gli iscritti nei dropdown autori dei post - edit e 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' );
}
/* Modifica il dropdown degli autori */
function wpse39084_showme_dropdown_users( $args = '' )
{
$post = get_post();
$selected = $post->post_author;
$siteusers = get_users( 'orderby=nicename&order=ASC' ); // puoi passare filtri e opzioni
$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;
}
/* Rimuove il meta box Autore dall'editing del post */
function wpse50827_author_metabox_remove()
{
remove_meta_box( 'authordiv', 'post', 'normal' );
}
/* Sposta il meta box Autore dentro il meta box Azioni Pubblicazione */
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;">Autore: ';
post_author_meta_box( $post );
echo '</div>';
}

Un modo migliore per farlo...
add_filter('wp_dropdown_users', 'MySwitchUser');
function MySwitchUser()
{
global $post; // rimuovere se non necessario
// global $post è disponibile qui, quindi puoi verificare il tipo di post qui
$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>';
}

Ho implementato una soluzione simile alla risposta accettata qui, ma volevo mostrare solo gli amministratori e, nel mio caso, un ruolo personalizzato di 'produttori', insieme.
add_filter('wp_dropdown_users', 'custom_author_select');
function custom_author_select($output){
//global $post è disponibile qui, quindi puoi verificare il tipo di post
$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=\"\">";
//Mantieni l'amministratore nella lista
$output .= "<option value=\"1\">Amministratore</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;
}

Questa potrebbe essere una soluzione per evitare l'errore nella modifica rapida, dove "cpt_slug" dovrebbe essere sostituito con lo slug del tuo custom post type
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' ) );
}

È un po' un casino. Sembra che ci siano 3 modi per affrontare la questione, e dipende dal fatto che tu stia utilizzando l'Editor Classico o Gutenberg.
Se stai utilizzando l'Editor Classico:
- Puoi sovrascrivere l'HTML utilizzando il filtro
wp_dropdown_users
come suggerito in altre risposte - Oppure sovrascrivere i parametri della query utilizzando
wp_dropdown_users_args
Se stai utilizzando Gutenberg, il menu a discesa degli Autori è implementato in modo diverso.
Come ha sottolineato Thomas Levy in questo issue su GitHub:
- La funzione del block ed. utilizzata per popolare il menu a discesa degli autori è wodpress/data/select( ‘core’ ).getAuthors()
- Questa chiama l'endpoint REST API: /wp/v2/users/?who=authors&per_page=-1
- Questo endpoint API passa i dati a WP_User_Query
- Una WP_User_Query con il parametro "who=>author" passerà una query usermeta al mix.
- Questo estrarrà qualsiasi utente con un user_level non uguale a 0
Affinché il ruolo personalizzato venga visualizzato nel menu a discesa degli autori, è necessario aggiungere la capacità level_1
al ruolo. I livelli sono stati sostituiti dalle capacità in WordPress 2.0 nel 2005, ma questo comportamento/bug è rimasto fino ad oggi.
$role = add_role( 'mycustomrole', 'My Custom Role' );
$role->add_cap( 'level_1' );
Per aggiungere questa capacità agli utenti esistenti, esegui questo codice una volta:
$custom_role = get_users( 'role=mycustomrole' );
foreach ( $custom_role as $role ) {
$role->add_cap( 'level_1' );
}

Ho provato tutte le soluzioni qui presenti e alcune altre, ma questa tratta dalle note degli utenti contributori nel Codex di Wordpress è stata l'unica che ha funzionato per me.
Dice che è necessario concedere la capacità agli iscritti di utilizzarla, ma nel mio caso non era quello che volevo. Volevo solo poterli selezionare nel menu a discesa degli autori.
// Mostra gli Iscritti nel menu a discesa 'autore' nell'editor classico dei post
function wpdocs_add_subscribers_to_dropdown( $query_args ) {
$query_args['who'] = ''; // resetta la query
$query_args['capability'] = ''; // resetta la query
$query_args['role__in'] = array( 'administrator', 'subscriber', 'author', 'editor' );
$query_args['capability__in'] = array( 'edit_own_posts' ); // Capacità personalizzata per gli iscritti
return $query_args;
}
add_filter( 'wp_dropdown_users_args', 'wpdocs_add_subscribers_to_dropdown' );
Link alla pagina del codex: https://developer.wordpress.org/reference/hooks/wp_dropdown_users_args/#user-contributed-notes
