Seleziona l'abbonato come autore di post nel pannello di amministrazione?


16

Voglio essere in grado di selezionare un abbonato un autore di un post nell'amministratore in modo che mostri il loro nome come aver scritto il post, ma non voglio dare loro ulteriori privilegi (se accedono l'unica cosa a cui possono accedere è il loro profilo).

Esiste un modo semplice per farlo senza dover cambiare ruoli e capacità?

Grazie

Risposte:


17

Questo è un semplice trucco che ho scritto in una situazione simile. Verrà visualizzato tutto Subscribersnel Authormenu a discesa su modifica / aggiungi post / pagina, da cui è possibile selezionare quello desiderato. Penso che dovrebbe funzionare per te ...

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

Il trucco dietro questo è, dopo aver inviato invia questa pagina, WP legge solo $ user-> ID da questo menu a discesa nell'array $ _POST e lo assegna come autore dei post. Ed è quello che vuoi!


Grazie mille Rutwick! Esattamente quello di cui avevo bisogno! Ho dovuto cambiare $ users = get_users (); altrimenti non mostrava utenti con altri ruoli lì
dentro

Prego, amico! :) In realtà lo stavo usando per un ruolo personalizzato, quindi i parametri ... Sono contento di poterti aiutare!
Rutwick Gangurde,

Ho appena riscontrato un problema minore con questo: quando rivedo la pagina di modifica post, il menu a discesa passa automaticamente ad admin, quindi se apporto modifiche e salvo senza riselezionare l'autore, questo cambia l'autore in admin. Qualche idea su come risolvere questo problema?
fxfuture,

Sì, ottieni l'autore per questo post e controlla quale degli utenti corrisponde all'autore, mantieni selezionata l'opzione.
Rutwick Gangurde,

2
Prova a stampare la global $postvariabile ...
Rutwick Gangurde

13

A partire da WordPress 4.4.0 è ora possibile utilizzare il wp_dropdown_users_argsfiltro. Il codice ora è molto più semplice:

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
Questa dovrebbe essere la risposta corretta / accettata. Direttamente dal Codice: developer.wordpress.org/reference/hooks/wp_dropdown_users_args/…
AndyWarren

2

Questo è un approccio simile a @brasofilo. Funziona solo nella schermata di modifica dei post, anziché nella modifica rapida e include tutti gli utenti (non solo autori e abbonati).

/* 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
        ) );
}

Questo imita l' autore predefinito metabox ma la chiamata wp_dropdown_usersomette l' who=>'editors'argomento. L'impostazione predefinita è l'unico altro valore che è utenti di chiamata.


Grazie Stefano. Ho finito per usare la soluzione di Rutwick perché funziona già con i CPT ma apprezzo la tua risposta :)
fxfuture,

aggiunto $ post globale; alla funzione effettiva poiché non stava rilevando l'autore esistente quando ho modificato un post, ma mi ha sempre preso come autore del post. Molto Annyoing.
danieldekay,

1

Un modo migliore per farlo ...

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

}

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

1

Questo è un codice collegato da @Innate in un commento (soluzione) alla sua stessa domanda, ho appena adattato un po 'e testato in WP 3.3.2 (funzione wpse39084). Mostrerà gli abbonati nei post Modifica e Modifica rapida.

Aggiunte anche un paio di azioni (funzioni wpse50827) per spostare la meta box Autore nella meta box Pubblica azioni, per una gestione più semplice.

Tutto è correlato ai post, nessuna pagina né 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
Grazie brasofilo. Ho finito per usare la soluzione di Rutwick perché funziona già con i CPT ma apprezzo la tua risposta :)
fxfuture,

0

Ho fatto qualcosa di simile alla risposta accettata qui, ma volevo solo mostrare agli 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 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

Questa potrebbe essere una soluzione per evitare l'errore nella modifica rapida, in cui "cpt_slug" dovrebbe essere sostituito con il tuo tipo di messaggio personalizzato

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' ) );
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.