Запрос пользователя WP для исключения пользователей без сообщений
Я вижу, что можно отсортировать запрос пользователя по количеству сообщений, которые есть у каждого пользователя, но можно ли исключить пользователей с нулевыми сообщениями из результата? В классе WP_User_Query есть действие pre_user_query
, но строки запроса являются огромным слабым местом, поэтому я не уверен, какое действие фильтра я хотел бы использовать здесь.
3 answers
Ну, я придумал 2 решения.
Решение 1 - цикл для каждого и проверка каждого пользователя
Это решение основано на решении @ghosttoast, но с обновленными функциями WordPress
//new query with default args
$author_query = new WP_User_Query();
// Get the results
$authors = $author_query->get_results();
if( $authors ) {
foreach( $authors as $author ) {
if ( count_user_posts( $author->id ) >= 1 ) {
echo $author->display_name . '</br>';
}
}
} else {
echo "no users found";
}
Решение 2 - модные штаны pre_user_query
действие
Вот о чем я думал, когда опубликовал свой вопрос, как только нашел действие pre_user_query
в классе WP_User_Query
. Если вы передадите post_count
в качестве своего параметра orderby
, то какой-нибудь необычный SQL-запрос, который я никогда бы сам не догадался, что случается соединять нужные столы вместе. Итак, что я сделал, так это скопировал это заявление о присоединении и добавил его к своему собственному. Было бы лучше, если бы я мог сначала проверить его наличие, прежде чем добавлять его... возможно, в будущем я буду использовать совпадение строк. Но на данный момент, поскольку я сам настраиваю запрос, я знаю, что его там нет, и я просто пока не буду беспокоиться об этом. Итак, код получился таким:
function authors_with_posts( $query ) {
if ( isset( $query->query_vars['query_id'] ) && 'authors_with_posts' == $query->query_vars['query_id'] ) {
$query->query_from = $query->query_from . ' LEFT OUTER JOIN (
SELECT post_author, COUNT(*) as post_count
FROM wp_posts
WHERE post_type = "post" AND (post_status = "publish" OR post_status = "private")
GROUP BY post_author
) p ON (wp_users.ID = p.post_author)';
$query->query_where = $query->query_where . ' AND post_count > 0 ';
}
}
add_action('pre_user_query','authors_with_posts');
А затем использовать его
$args = ( array( 'query_id' => 'authors_with_posts' ) );
$author_query = new WP_User_Query( $args );
Идея для параметр query_id
взят из введения к классу wp_user_class
Что также является просто очень хорошей ссылкой на WP_User_Query
Начиная с версии 4.4, вы можете просто использовать параметр `has_published_posts'.
Пример:
$authors = get_transient('mytheme_all_authors');
if (empty($authors)){
$user_args = array(
'role__in' => array('Author', 'Administrator', 'Contributor'),
'orderby' => 'post_count',
'order' => 'DESC',
'count_total' => true,
'has_published_posts' => array('post'),
);
$authors = new WP_User_Query( $user_args );
set_transient('mytheme_all_authors', $authors, 1 * HOUR_IN_SECONDS );
}
$total= $authors->get_total();
$authors = $authors->results;
foreach ( $authors as $user) {
// loop through your users....
has_published_posts
может быть либо true/false (или null), либо массив типов сообщений (как в этом примере).
Примечание: Я использую здесь переходные процессы, потому что этот конкретный запрос может быть довольно тяжелым в зависимости от системы, поэтому имеет смысл сохранить его для дальнейшего использования.
Отправка в качестве ответа для закрытия:
$all_members = get_users();
foreach($all_members as $member){
$post_count = count_user_posts($member->ID);
if(empty($post_count)) {
$bad_writers[] = $member->ID;
continue;
} else {
// do something;
}
}