Selezionare un subscriber come autore di un post nel pannello admin?

2 mag 2012, 03:33:09
Visualizzazioni: 16.9K
Voti: 16

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

0
Tutte le risposte alla domanda 9
10
19

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!

2 mag 2012 15:27:59
Commenti

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

fxfuture fxfuture
2 mag 2012 23:42:47

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

Rutwick Gangurde Rutwick Gangurde
3 mag 2012 08:22:22

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?

fxfuture fxfuture
5 mag 2012 04:59:12

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

Rutwick Gangurde Rutwick Gangurde
5 mag 2012 08:08:32

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

fxfuture fxfuture
7 mag 2012 01:06:50

Prova a stampare la variabile global $post...

Rutwick Gangurde Rutwick Gangurde
7 mag 2012 07:20:05

Bentornato :D

Rutwick Gangurde Rutwick Gangurde
8 mag 2012 09:09:04

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

fuxia fuxia
1 mar 2013 02:41:42

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)

Marius Stuparu Marius Stuparu
5 mar 2013 17:41:36

Fa esattamente quello che deve fare!!!

Rodrigo Zuluaga Rodrigo Zuluaga
3 apr 2020 09:06:55
Mostra i restanti 5 commenti
1
16

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;

}
30 gen 2016 00:27:07
Commenti

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

AndyWarren AndyWarren
13 nov 2016 17:35:00
2

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.

2 mag 2012 15:12:33
Commenti

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

fxfuture fxfuture
2 mag 2012 23:46:28

ho aggiunto global $post; alla funzione effettiva poiché non rilevava l'autore esistente quando modificavo un post, ma mi prendeva sempre come autore del post. Molto fastidioso.

danieldekay danieldekay
26 dic 2013 13:20:48
1

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>';
}
2 mag 2012 14:38:08
Commenti

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

fxfuture fxfuture
2 mag 2012 23:46:50
1

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

}
1 mar 2013 02:37:41
Commenti

non funziona per me: propone sempre l'account Admin come nuovo autore del post, il che rende molto difficile per gli utenti aggiornare effettivamente i post (e poi perdere automaticamente i diritti di modifica).

danieldekay danieldekay
26 dic 2013 13:22:38
0

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;
}
1 mar 2015 01:10:20
0

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' ) );
}
4 mag 2017 17:17:58
0

È 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:

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' );
}
13 set 2023 15:44:29
0

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

23 ago 2024 23:29:52