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


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

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

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

Например,

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

Я начал и пошел по этому маршруту:

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

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

Я новичок в wordpress и PHP, поэтому буду признателен за любую помощь.

Author: Michael Ecklund, 2014-08-16

3 answers

Вам необходимо установить параметр 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();
 8
Author: Pieter Goosen, 2014-08-16 13:02:25

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

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

Честно говоря, когда вы запрашиваете пользователей, заказывающих их по количеству сообщений, соединение уже создано 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' );
 6
Author: gmazzap, 2014-08-16 13:25:47

Начиная с версии 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 );
}

Ресурсы

 4
Author: Michael Ecklund, 2018-01-17 18:52:38