Запрос пользователя WP для исключения пользователей без сообщений


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

Author: helgatheviking, 2012-12-19

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

 10
Author: helgatheviking, 2012-12-20 00:36:20

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

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

 3
Author: pixeline, 2016-07-06 23:48:14

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

   $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;
        }
    }
 0
Author: GhostToast, 2012-12-20 19:04:44