Como exibir uma lista de usuários que fizeram pelo menos 1 postagem?

8

O que eu gostaria de fazer é ter uma lista de usuários que contribuíram com pelo menos uma postagem.

Eu preciso mostrar o seguinte:

[Foto do usuário] | [Nome do usuário] | [Contagem de postagens do usuário]

por exemplo

[foto] Joe Bloggs (8)

Comecei e segui esta rota:

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

No entanto, isso parece apenas retornar todos os usuários registrados no blog, e não aqueles que contribuíram, então certamente não estou fazendo isso corretamente.

Eu sou novo no wordpress e PHP, então toda a ajuda seria apreciada.

steakpi
fonte
Quer algo estilizado? Tente isso wpsites.net/web-design/author-contributors-page-template #
Brad Dalton

Respostas:

8

Você precisa definir o whoparâmetro emget_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 eu estava respondendo rapidamente. O código na sua pergunta e na minha resposta é o começo do que você deseja alcançar.

Não tenho tempo para codificar agora, assistir ao rugby, mas aqui está o código completo usado nos vinte e quatorze para exibir autores e sua contagem de postagens. Espero que isto ajude

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

Basta chamá-lo em seus arquivos de modelo como

twentyfourteen_list_authors();
Pieter Goosen
fonte
Você também pode adicionar um parâmetro de status codex.wordpress.org/Class_Reference/WP_Query#Status_Parameters
Brad Dalton
IIRC que exibe usuários com capacidade para postar, não usuário que postou algo efetivamente.
gmazzap
Estou me referindo a se publicou postagens se (! $ Post_count) {continue;
Brad Dalton
Pieter, eu acho que pode melhorar o desempenho de sua função, olhar para a minha resposta;)
gmazzap
count_many_users_posts()A função deve ser usada para eficiência, ao contar para um conjunto de vários usuários.
Rarst
6

Não há nenhuma maneira padrão no WordPress para fazer esta tarefa, como Pieter Goosen apontou, existe o argumento whode get_users()que os usuários de retornos que pode postar, não os usuários que têm publicados.

No entanto, você pode 'pre_user_query'adicionar uma JOINcláusula SQL para obter apenas usuários que tenham pelo menos uma postagem.

Para ser honesto, quando você consulta os usuários ordenando-os por contagem post, a junção é já criado por WordPress, mas usando um OUTER LEFT JOIN, por isso mesmo os usuários sem as mensagens são devolvidas, então a única coisa que você precisa é para substituir o OUTER LEFT JOINa umINNER 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
fonte
Você deve estourar minha bolha, lol :-). Ótima resposta, devo dizer. Nunca pensei nessa direção para ser honesto. 1
Pieter Goosen
Isso é ótima informação para saber! Obrigado pela ajuda. Acabei de experimentar sua solução e isso também me aproxima de onde eu preciso estar. :)
steakpi
3

Desde a versão 4.3.0, agora você pode especificar o parâmetro has_published_postspara a get_users();chamada de função.

Passe um arraydos tipos de postagem para filtrar os resultados para os usuários que publicaram postagens nesses tipos de postagem. trueé um alias para todos os tipos de postagem pública.


Exemplo

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
fonte