Como exibir uma lista de usuários que fizeram pelo menos uma 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 de usuário] | [Contagem de postagens de usuários]

por exemplo,

[foto] Joe Bloggs (8)

Eu comecei e segui esse caminho:

<?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, em vez daqueles que contribuíram, portanto, não estou fazendo corretamente.

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

    
por steakpi 16.08.2014 / 13:34

3 respostas

8

Você precisa definir o parâmetro who em get_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 rápido. O código na sua pergunta e na minha resposta é o começo para o que você deseja alcançar.

Não tenho tempo para codificar agora, para assistir ao rugby, mas aqui está o código completo usado nos vinte e quatorze para mostrar os autores e sua contagem de postagens. Espero que isso 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 nos seus arquivos de modelo como

twentyfourteen_list_authors();
    
por Pieter Goosen 16.08.2014 / 14:20
6

Não há nenhuma maneira padrão no WordPress para fazer esta tarefa, como apontou Pieter Goosen , existe o argumento who para get_users() que retorna usuários que podem postar, não os usuários que publicaram .

No entanto, você pode usar 'pre_user_query' para adicionar uma cláusula JOIN SQL para obter apenas usuários com pelo menos uma postagem.

Para ser honesto, quando você consulta usuários ordenando-os por contagem de posts, a junção já é criada pelo WordPress, mas usando um OUTER LEFT JOIN , então mesmo usuários sem posts são retornados, então a única coisa que você precisa é substituir o OUTER LEFT JOIN para um 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' );
    
por gmazzap 16.08.2014 / 15:25
1

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

  

Passe um array de tipos de postagens para filtrar os resultados para usuários que têm   posts publicados nesses tipos de postagens. true é um alias para todos os públicos   postar tipos.

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

por Michael Ecklund 17.01.2018 / 19:32