web-dev-qa-db-fra.com

Comment afficher une liste d'utilisateurs ayant effectué au moins 1 publication?

Ce que je voudrais faire, c'est avoir une liste des utilisateurs qui ont contribué au moins un post.

Je dois montrer ce qui suit:

[Photo d'utilisateur] | [Nom d'utilisateur] | [Nombre de messages utilisateur]

par exemple.

[photo] Joe Bloggs (8)

J'ai commencé et suis allé dans cette voie:

<?php
   $blogusers = get_users( 'orderby=post_count' );
      foreach ( $blogusers as $user ) {
      echo '<li>' . esc_html( $user->display_name ) . '</li>';
   }
?>

Cependant, cela semble simplement renvoyer tous les utilisateurs inscrits sur le blog plutôt que ceux qui ont contribué, donc je ne le fais certainement pas correctement.

Je suis nouveau sur Wordpress et PHP alors toute aide serait la bienvenue.

8
steakpi

Vous devez définir le paramètre who dans get_users

<?php
   $blogusers = get_users( 'orderby=post_count&who=authors' );
      foreach ( $blogusers as $user ) {
      echo '<li>' . esc_html( $user->display_name ) . '</li>';
   }
?>

EDIT

Il semble que je devais répondre rapidement. Le code dans votre question et dans ma réponse est le début de ce que vous voulez réaliser.

Je n'ai pas le temps de coder pour regarder le rugby, mais voici le code complet utilisé dans les vingt-quatorze pour afficher les auteurs et leur nombre de posts. J'espère que cela t'aides

function twentyfourteen_list_authors() {
    $contributor_ids = get_users( array(
        'fields'  => 'ID',
        'orderby' => 'post_count',
        'order'   => 'DESC',
        'who'     => 'authors',
    ) );

    foreach ( $contributor_ids as $contributor_id ) :
        $post_count = count_user_posts( $contributor_id );

        // Move on if user has not published a post (yet).
        if ( ! $post_count ) {
            continue;
        }
    ?>

    <div class="contributor">
        <div class="contributor-info">
            <div class="contributor-avatar"><?php echo get_avatar( $contributor_id, 132 ); ?></div>
            <div class="contributor-summary">
                <h2 class="contributor-name"><?php echo get_the_author_meta( 'display_name', $contributor_id ); ?></h2>
                <p class="contributor-bio">
                    <?php echo get_the_author_meta( 'description', $contributor_id ); ?>
                </p>
                <a class="button contributor-posts-link" href="<?php echo esc_url( get_author_posts_url( $contributor_id ) ); ?>">
                    <?php printf( _n( '%d Article', '%d Articles', $post_count, 'twentyfourteen' ), $post_count ); ?>
                </a>
            </div><!-- .contributor-summary -->
        </div><!-- .contributor-info -->
    </div><!-- .contributor -->

    <?php
    endforeach;
}

Appelez-le simplement dans vos fichiers de modèle comme

twentyfourteen_list_authors();
8
Pieter Goosen

Il n’existe aucun moyen par défaut dans WordPress d’effectuer cette tâche, car Pieter Goosen a souligné, existe l’argument who pour get_users() qui renvoie les utilisateurs que can post, et non les utilisateurs que ont posté.

Toutefois, vous pouvez utiliser 'pre_user_query' pour ajouter une clause SQL JOIN afin de ne récupérer que les utilisateurs ayant au moins une publication.

Pour être honnête, lorsque vous interrogez les utilisateurs qui les commandent en fonction du nombre de messages, la jointure est déjà créée par WordPress, mais en utilisant un OUTER LEFT JOIN, ainsi, même les utilisateurs sans message sont renvoyés. La seule chose dont vous avez besoin est de remplacer le OUTER LEFT JOIN par un INNER JOIN.

function filter_users_have_posted( $user_query ) {
   $user_query->query_from = str_replace( 'LEFT OUTER', 'INNER', $user_query->query_from );
   remove_action( current_filter(), __FUNCTION__ );
}

add_action( 'pre_user_query', 'filter_users_have_posted' );

$blogusers = get_users( 'orderby=post_count&order=desc' );
6
gmazzap

Depuis la version 4.3.0, vous pouvez maintenant spécifier le paramètre has_published_posts à l'appel de fonction get_users();.

Passez une array types de publication pour filtrer les résultats aux utilisateurs ayant publié des publications dans ces types de publication. true est un alias pour tous les types de publications publiques.


Exemple

if ( $users = get_users( array(
    'orderby'             => 'nicename',
    'order'               => 'ASC',
    'has_published_posts' => array( 'post' ),
    'blog_id'             => absint( get_current_blog_id() )
) ) ) {
    print_r( $users );
}

Ressources

2
Michael Ecklund