Как отобразить список Пользователей, Которые Сделали хотя бы 1 сообщение?
Что я хотел бы сделать, так это составить список пользователей, которые опубликовали хотя бы один пост.
Мне нужно показать следующее:
[ Фотография пользователя] | [Имя пользователя] | [Количество сообщений пользователя]
Например,
[ фото] Джо Блоггс(8)
Я начал и пошел по этому маршруту:
<?php
$blogusers = get_users( 'orderby=post_count' );
foreach ( $blogusers as $user ) {
echo '<li>' . esc_html( $user->display_name ) . '</li>';
}
?>
Однако, похоже, это просто возвращает всех пользователей, зарегистрированных в блоге, а не тех, кто внес свой вклад, поэтому я, конечно, этого не делаю правильно.
Я новичок в wordpress и PHP, поэтому буду признателен за любую помощь.
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();
В 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' );
Начиная с версии 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 );
}
Ресурсы