¿Cómo mostrar una lista de usuarios que han hecho al menos 1 publicación?

8

Lo que me gustaría hacer es tener una lista de usuarios que han contribuido al menos con una publicación.

Necesito mostrar lo siguiente:

[Foto de usuario] | [Nombre de usuario] | [Recuento de publicaciones del usuario]

p.ej

[foto] Joe Bloggs (8)

Empecé y seguí esta ruta:

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

Sin embargo, esto parece devolver a todos los usuarios registrados en el blog en lugar de aquellos que han contribuido, por lo que ciertamente no lo estoy haciendo correctamente.

Soy nuevo en WordPress y PHP, por lo que agradecería toda ayuda.

steakpi
fuente
¿Quieres algo con estilo? Pruebe esto wpsites.net/web-design/author-contributors-page-template
Brad Dalton

Respuestas:

8

Necesita configurar el whoparámetro enget_users

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

EDITAR

Parece que estaba respondiendo rápidamente. El código en su pregunta y en mi respuesta es el comienzo de lo que desea lograr.

No tengo tiempo para codificar ahora, para ver rugby, pero aquí está el código completo utilizado en los catorce catorce para mostrar a los autores y su recuento de publicaciones. Espero que esto ayude

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

Simplemente llámelo en sus archivos de plantilla como

twentyfourteen_list_authors();
Pieter Goosen
fuente
También puede agregar un parámetro de estado codex.wordpress.org/Class_Reference/WP_Query#Status_Parameters
Brad Dalton
IIRC que muestra usuarios que tienen la capacidad de publicar, no usuarios que han publicado algo efectivamente.
gmazzap
Me refiero a si he publicado publicaciones if (! $ Post_count) {continuar;
Brad Dalton
Pieter, creo que puedo mejorar el rendimiento de tu función, mira mi respuesta;)
gmazzap
count_many_users_posts()La función debe usarse para la eficiencia, cuando se cuenta para un conjunto de usuarios múltiples.
Rarst
6

No hay una forma predeterminada en WordPress para hacer esta tarea, como señaló Pieter Goosen , existe el argumento whopara get_users()que devuelva los usuarios que pueden publicar, no los usuarios que han publicado.

Sin embargo, puede usar 'pre_user_query'para agregar una JOINcláusula SQL para obtener solo usuarios que tengan al menos una publicación.

Para ser honesto, cuando se consulta a los usuarios que les ordenan por número de correos, la unión se ya creado con WordPress, pero utilizando una OUTER LEFT JOIN, por lo que incluso se devuelven a los usuarios que no tienen mensajes, por lo que la única cosa que necesita es reemplazar el OUTER LEFT JOINde unaINNER 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
fuente
¿Debes reventar mi burbuja, jajaja :-). Gran respuesta, debo decir. Nunca pensé en esa dirección para ser honesto. +1
Pieter Goosen
Esa es una gran información para saber! Gracias por tu ayuda. Acabo de probar su solución y eso también me acerca a donde necesito estar. :)
steakpi
3

Desde la versión 4.3.0, ahora puede especificar el parámetro has_published_postspara la get_users();llamada a la función.

Pase un tipo arrayde publicación para filtrar los resultados a los usuarios que han publicado publicaciones en esos tipos de publicación. truees un alias para todos los tipos de publicaciones públicas.


Ejemplo

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

Recursos

Michael Ecklund
fuente