Comment afficher une liste d'utilisateurs qui ont fait au moins 1 message?

8

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

Je dois montrer ce qui suit:

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

par exemple

[photo] Joe Bloggs (8)

J'ai pris un départ et j'ai emprunté cette voie:

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

Cependant, cela semble renvoyer tous les utilisateurs enregistrés 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, donc toute aide serait appréciée.

steakpi
la source
Vous voulez quelque chose de stylé? Essayez ceci wpsites.net/web-design/author-contributors-page-template
Brad Dalton

Réponses:

8

Vous devez définir le whoparamètre dansget_users

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

ÉDITER

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 maintenant, de regarder le rugby, mais voici le code complet utilisé dans les vingt-quatorze pour afficher les auteurs et leur nombre de messages. 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();
Pieter Goosen
la source
Vous pouvez également ajouter un paramètre d'état codex.wordpress.org/Class_Reference/WP_Query#Status_Parameters
Brad Dalton
IIRC qui affiche les utilisateurs qui ont la capacité de publier, pas les utilisateurs qui ont effectivement publié quelque chose.
gmazzap
Je fais référence à if ont publié des articles if (! $ Post_count) {continue;
Brad Dalton
Pieter, je pense que je peux améliorer les performances de votre fonction, regardez ma réponse;)
gmazzap
count_many_users_posts()la fonction doit être utilisée pour l'efficacité, lors du comptage pour un ensemble de plusieurs utilisateurs.
Rarst
6

Il n'y a aucun moyen par défaut dans WordPress pour effectuer cette tâche, comme l'a souligné Pieter Goosen , existe l'argument whoselon get_users()lequel renvoie les utilisateurs qui peuvent publier, pas les utilisateurs qui ont posté.

Cependant, vous pouvez utiliser 'pre_user_query'pour ajouter une JOINclause SQL pour obtenir uniquement les utilisateurs qui ont au moins une publication.

Pour être honnête, lorsque vous interrogez des utilisateurs les commandant par nombre de publications, la jointure est déjà créée par WordPress, mais en utilisant un OUTER LEFT JOIN, donc même les utilisateurs sans publication sont renvoyés, donc la seule chose dont vous avez besoin est de remplacer le OUTER LEFT JOINpar unINNER 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' );
gmazzap
la source
Faut-il éclater ma bulle, lol :-). Excellente réponse, je dois dire. Je n'ai jamais pensé dans cette direction pour être honnête. +1
Pieter Goosen
C'est une excellente information à savoir! Merci de votre aide. Je viens d'essayer votre solution et cela me rapproche également de l'endroit où je dois être. :)
steakpi
3

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

Passez l'un arraydes types de publication pour filtrer les résultats aux utilisateurs qui ont publié des publications dans ces types de publication. trueest un alias pour tous les types de publication publique.


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

Michael Ecklund
la source