web-dev-qa-db-fra.com

Comment afficher l'utilisateur qui a publié un article en attente?

J'essaie de répertorier le nom des modérateurs (utilisateurs dotés du rôle d'éditeur) qui publient des publications en attente. J'ai créé un widget de tableau de bord qui affiche les 10 derniers articles publiés et l'auteur, mais je ne parviens pas à obtenir l'utilisateur qui l'a publié. Je pensais que the_modified_author pourrait bien être cela, mais je ne sais pas s'il existe une meilleure façon de dire qui a publié le message? De toute façon, ma méthode ne fonctionne pas. Voici mon code jusqu'à présent:

function dashboard_widget_function() {

    $args = array( 'post_status' => 'publish', 'numberposts' => '10', 'post_type' => 'post');

        $recent_posts = wp_get_recent_posts( $args );

     echo '<table><tr>
    <th>Post Title</th>
    <th>Author</th>
    <th>Moderated by</th></tr>';

        foreach( $recent_posts as $recent ){ 
            $post_author = get_user_by( 'id', $recent['post_author'] );
            echo '<tr><td><a href="' . get_permalink($recent["ID"]) . '" title="Read: '.esc_attr($recent["post_title"]).'" >' .   $recent["post_title"].'</a></td>';
            echo '<td>'. $post_author->display_name .'</td>';
            echo '<td>'.get_the_modified_author().'</td></tr>';

        }
        echo '</table>';
}
4
Michael Rogers

La raison pour laquelle get_the_modified_author() ne fonctionne pas est qu’elle repose sur son utilisation dans la boucle WordPress. wp_get_recent_posts() ne configure pas d'objet de publication global. Voici un exemple complet basé sur votre code d'origine qui remplace get_the_modified_author() par un code simple pour obtenir le nom de la dernière personne qui a modifié le message (ce qui correspond essentiellement à ce que get_the_modified_author() fait):

/**
 * Add a widget to the dashboard.
 *
 * This function is hooked into the 'wp_dashboard_setup' action below.
 */
function example_add_dashboard_widgets() {
    wp_add_dashboard_widget(
        'example_dashboard_widget', // Widget slug.
        'Example Dashboard Widget', // Title.
        'example_dashboard_widget_function' // Display function.
    );  
}
add_action( 'wp_dashboard_setup', 'example_add_dashboard_widgets' );

function example_dashboard_widget_function() {
    $items_to_show = 10;
    $counter       = 0;
    $recent_posts  = wp_get_recent_posts( [
        'post_status' => 'publish',
        'numberposts' => '50', // More than we want, but tries to ensure we have enough items to display.
        'post_type'   => 'post'
    ] );

    echo '<table>
                    <tr>
                        <th>Post Title</th>
                        <th>Author</th>
                        <th>Moderated by</th>
                    </tr>';

    foreach ( $recent_posts as $recent ) {
        $post_author  = get_user_by( 'id', $recent['post_author'] );
        $last_user_id = get_post_meta( $recent['ID'], '_edit_last', true );
        $last_user    = get_userdata( $last_user_id );

        // Bail out of the loop if we've shown enough items.
        if ( $counter >= $items_to_show ) {
            break;
        }

        // Skip display of items where the author is the same as the moderator:
        if ( $post_author->display_name === $last_user->display_name ) {
            continue;
        }

        echo '<tr><td><a href="' . get_permalink( $recent['ID'] ) . '" title="Read: ' . 
            esc_attr( $recent['post_title'] ).'" >' .   $recent['post_title'].'</a></td>';
        echo '<td>'. esc_html( $post_author->display_name ) .'</td>';

        echo '<td>'. esc_html( $last_user->display_name ) .'</td></tr>';

        $counter++;
    }
    echo '</table>';
}

Édition basée sur les commentaires d'un commentaire: Ce code ignore l'affichage des éléments où $post_author->display_name === $last_user->display_name. Ce n'est cependant pas le code le plus efficace, car nous interrogeons plus d'éléments que nécessaire. Ceci est fait parce que nous allons ignorer certains éléments et que nous voulons (essayer) de nous assurer qu'il y a au moins 10 éléments à afficher ($items_to_show = 10).

4
Dave Romsey

Nous pourrions enregistrer l'identifiant de l'utilisateur qui a publié le dernier article, en tant que valeur de la clé méta _wpse_user_last_published post, avec:

add_action( 'transition_post_status', function( $new_status, $old_status, $post )
{
    if( 
           $new_status !== $old_status 
        && 'publish' === $new_status 
        && 'post' === get_post_type( $post ) 
    )
        update_post_meta( $post->ID, '_wpse_user_last_published', get_current_user_id() );

}, 10, 3 );

Ensuite, vous pourrez récupérer ces informations lorsque vous listez vos publications.

Pour plus de détails et une recherche plus rapide, il peut être préférable de créer un tableau de journal personnalisé.

3
birgire