Как отобразить список пользователей, которые сделали по крайней мере 1 сообщение?

8

То, что я хотел бы сделать, это иметь список пользователей, которые внесли хотя бы один пост.

Мне нужно показать следующее:

[Фото пользователя] | [Имя пользователя] | [Количество сообщений пользователя]

например

[фото] Джо Блоггс (8)

Я вздрогнул и пошел по этому маршруту:

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

Однако, похоже, что это просто возвращает всех пользователей, зарегистрированных в блоге, а не тех, кто внес свой вклад, поэтому я, конечно, не делаю это правильно.

Я новичок в WordPress и PHP, поэтому вся помощь будет оценена.

steakpi
источник
Хотите что-нибудь в стиле? Попробуйте это wpsites.net/web-design/author-contributors-page-template
Брэд Далтон

Ответы:

8

Вам нужно установить whoпараметр вget_users

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

РЕДАКТИРОВАТЬ

Кажется, я должен был быстро ответить. Код в вашем вопросе и в моем ответе - это начало того, чего вы хотите достичь.

Сейчас у меня нет времени писать код, чтобы посмотреть регби, но вот полный код, использованный в двадцати четырнадцати для отображения авторов и их количества постов. Надеюсь это поможет

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

Просто назовите это в своих файлах шаблона как

twentyfourteen_list_authors();
Питер Гусен
источник
Вы также можете добавить параметр состояния codex.wordpress.org/Class_Reference/WP_Query#Status_Parameters
Брэд Далтон
IIRC, которые отображают пользователей, которые имеют возможность размещать сообщения, а не пользователей, которые эффективно что-то опубликовали.
gmazzap
Я имею в виду, если опубликовал посты if (! $ Post_count) {продолжение;
Брэд Далтон
Питер, я думаю, что могу улучшить производительность твоей функции, посмотри на мой ответ;)
gmazzap
count_many_users_posts()Функция должна использоваться для повышения эффективности при подсчете множества пользователей.
Rarst
6

Там нет никакого способа по умолчанию в WordPress , чтобы сделать эту задачу, как и Питер Goosen указал, существует аргумент whoдля того, get_users()что возвращает пользователей , которые могут сообщение, а не пользователи , которые уже размещены.

Однако вы можете использовать, 'pre_user_query'чтобы добавить предложение JOINSQL, чтобы получить только пользователей, у которых есть хотя бы один пост.

Честно говоря, когда вы запрашиваете пользователи , заказывающие их по почте кол -во , присоединяйтесь уже создан WordPress, но используя OUTER LEFT JOIN, так что даже пользователи, не имеющие сообщений возвращаются, так что единственное , что вам нужно , чтобы заменить OUTER LEFT JOINна а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' );
Gmazzap
источник
Должен ли ты лопнуть мой пузырь, смеется :-). Отличный ответ, должен сказать. Никогда не думал в этом направлении, чтобы быть честным. +1
Питер Гусен
Это отличная информация, чтобы знать! Спасибо за вашу помощь. Просто попробовал ваше решение, и это также приблизило меня к тому месту, где я должен быть. :)
steakpi
3

Начиная с версии 4.3.0, теперь вы можете указать параметр has_published_postsдля get_users();вызова функции.

Передайте arrayтип сообщений, чтобы отфильтровать результаты пользователям, опубликовавшим сообщения в этих типах. trueявляется псевдонимом для всех публичных типов сообщений.


пример

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

Ресурсы

Майкл Эклунд
источник