Sélectionnez l'abonné comme auteur de la publication dans le panneau d'administration?

16

Je veux pouvoir sélectionner un abonné auteur d'un article dans l'admin afin qu'il affiche son nom comme ayant écrit l'article, mais je ne veux pas leur donner de privilèges supplémentaires (s'ils se connectent, la seule chose à laquelle ils peuvent accéder est leur profil).

Existe-t-il un moyen simple de le faire sans avoir à modifier les rôles et les capacités?

Merci

fxfuture
la source

Réponses:

17

Il s'agit d'un simple hack que j'ai écrit dans une situation similaire. Il affichera tous les éléments Subscribersdans le Authormenu déroulant sur la modification / l'ajout d'un article / d'une page, d'où vous pourrez sélectionner celui que vous souhaitez. Je pense que cela devrait fonctionner pour vous ...

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

L'astuce derrière cela est, après avoir soumis soumettre cette page, WP ne lit que $ user-> ID à partir de cette liste déroulante dans le tableau $ _POST, et l'affecte en tant qu'auteur des articles. Et c'est ce que tu veux!

Rutwick Gangurde
la source
Merci beaucoup Rutwick! Exactement ce dont j'avais besoin! J'ai juste eu à changer $ users = get_users (); sinon il n'affichait pas les utilisateurs avec d'autres rôles
fxfuture
Vous êtes bienvenu mon pote! :) En fait, je l'utilisais pour un rôle personnalisé, d'où les paramètres ... Heureux d'avoir pu aider!
Rutwick Gangurde
Je viens de trouver un problème mineur avec cela - lorsque je revisite la page de post-édition, le menu déroulant est par défaut admin, donc si je fais des changements et que j'enregistre sans resélectionner l'auteur, cela change l'auteur en admin. Une idée de comment résoudre ce problème?
fxfuture
Oui, vous obtenez l'auteur de ce message et vérifiez lequel des utilisateurs correspond à l'auteur, conservez cette option sélectionnée.
Rutwick Gangurde
2
Essayez d'imprimer la global $postvariable ...
Rutwick Gangurde
13

Depuis WordPress 4.4.0, vous pouvez désormais utiliser le wp_dropdown_users_argsfiltre. Le code est beaucoup plus simple maintenant:

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;

}
jg314
la source
3
Cela devrait être la réponse correcte / acceptée. Directement à partir du Codex: developer.wordpress.org/reference/hooks/wp_dropdown_users_args/…
AndyWarren
2

Il s'agit d'une approche similaire à @brasofilo. Mais ne fonctionne que dans l'écran d'édition de publication, plutôt que de modification rapide, et inclut tous les utilisateurs (pas seulement les auteurs et les abonnés).

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

Cela imite la métabox auteur par défaut mais l'appel wp_dropdown_usersomet l' who=>'editors'argument. Il s'agit par défaut de la seule autre valeur qui est appeler les utilisateurs.

Stephen Harris
la source
Merci Stephen. J'ai fini par utiliser la solution de Rutwick car elle fonctionne déjà avec les CPT mais apprécie votre réponse :)
fxfuture
ajout de $ post mondial; à la fonction réelle car il ne reprenait pas l'auteur existant lorsque je modifiais un article, mais il m'a toujours pris comme auteur de l'article. Très Annyoing.
danieldekay
1

Une meilleure façon de le faire ...

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

}
Andru-1983
la source
ne fonctionne pas pour moi: il propose toujours le compte Admin pour devenir le nouvel auteur du message, ce qui rend très difficile pour les utilisateurs de mettre à jour les messages (puis de perdre automatiquement les droits d'édition).
danieldekay
1

Ceci est un code lié par @Innate dans un commentaire (solution) à sa propre question, je viens de l'adapter un peu et de le tester dans WP 3.3.2 (fonction wpse39084). Il montrera les abonnés dans les articles Edit et Quick Edit.

Ajout de quelques actions (fonctions wpse50827) pour déplacer la méta-boîte Auteur dans la méta-boîte Publier des actions, pour une gestion plus facile.

Tout est lié à la poste, pas de pages ni de 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>';
}
brasofilo
la source
1
Merci brasofilo. J'ai fini par utiliser la solution de Rutwick car elle fonctionne déjà avec les CPT mais apprécie votre réponse :)
fxfuture
0

J'ai fait quelque chose de similaire à la réponse acceptée ici, mais je voulais seulement montrer aux administrateurs et dans mon cas, un rôle de `` producteurs '' personnalisé, ensemble.

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;
}
D3XT3R
la source
0

Cela pourrait être une solution pour éviter l'erreur dans l'édition rapide, où "cpt_slug" devrait être remplacé par votre slug de type de publication personnalisé

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' ) );
}
Marcello Magi Spinetti
la source