WP_User_Query для исключения пользователей без постов

9

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

helgatheviking
источник
Разве не так сложно просто отбросить из результатов тех пользователей, которые post_count== 0?
GhostToast
3
Я только собирался закрыть это как совершенно идиотский вопрос. WordPress делает это автоматически с помощью get_posts_by_author_sqlфункции, которая генерирует SQL для get_authors()запроса. Пользователи должны иметь опубликованное или личное сообщение, которое будет включено в результаты. #facepalm
helgatheviking
круто рад, что вы нашли ответ
GhostToast
Я тоже! Хотя нет возможности закрыть вопрос по причине глупости. Спасибо за то, что присоединились. Я буду применять ваш совет, потому что я хочу сохранить get_authors()результат как кратковременный ... тогда я могу просто пропустить текущего автора без необходимости каждый раз делать запрос.
Helgatheviking
1
Этот вопрос не глупый, он получил отрицательные отзывы, пожалуйста, предоставьте свое решение в качестве ответа, поскольку это может помочь другим.
Wyck

Ответы:

10

Ну, я придумала 2 решения.

Решение 1 - цикл foreach и проверка каждого пользователя

Этот основан на решении @ 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

helgatheviking
источник
1
Это прекрасно. Теперь все, что нам нужно, это способ настроить количество страниц для нумерации страниц в соответствии с новым переработанным списком ...
Кристина Купер
Хороший звонок. Не знаю, как это сделать.
Helgatheviking
author-> id теперь is author-> ID (небольшое изменение, но идентификатор устарел)
raison
3

Начиная с 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), либо массивом типов записей (как в этом примере).

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

pixeline
источник
0

Отправка в качестве ответа для закрытия:

   $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;
        }
    }
GhostToast
источник
Это обходной путь, необходимый для получения пользователей всех ролей? Я обнаружил, что если оставить этот аргумент пустым, не будут возвращены все пользователи в мультисайте.
Helgatheviking
get_users_with_role()не является функцией WordPress или я слишком долго смотрю на свой компьютер?
Helgatheviking
1
Не существует Поиск 966 файлов для "get_users_with_role": 0 matches across 0 files. Также get_usernumpostsамортизируется, используйтеcount_user_posts()
Wyck
Argh! мои извинения. это была функция, которую я написал для сайта на основе участников. Вы можете просто использовать get_users () и передавать ему любые параметры: codex.wordpress.org/Function_Reference/get_users
GhostToast
@GhostToast Пожалуйста, обновите свой ответ.
Кайзер