Intereting Posts
Как я могу отредактировать электронную почту, отправленную при получении нового комментария? Пейджинговые комментарии не показывают Персонализация WordPress для нескольких блогов в многопользовательском режиме с расширенным настраиваемым полем js solution to … Комментарии могут только оставлять комментарии, но могут отвечать на их дерево комментариев неограниченно Удалите "/ page / 1" из URL-адреса Force Custom Post Slug следовать нормальному правилу Post Slug Использование нескольких настроек_поле () на странице настроек 1 Есть ли способ отключить определенное поведение прокрутки? Как я должен структурировать проект веб-сайта WP с использованием git и обновления с панели инструментов WP? Перевести сторонний плагин и сохранить файлы переводов в пользовательской теме Где передается ключ _wp_page_template? WP_Query: как отсортировать мета значение и использовать LEFT JOIN? Проблема в If else условие Иерархия пользовательских сообщений? (Государство / Город / ресторан) Сделайте Google индексировать весь пост, если он разделен на несколько страниц

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

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

Ну, я придумал 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 action

Это то, о чем я думал, когда я разместил свой вопрос, как только я нашел действие WP_User_Query классе WP_User_Query . Если вы передадите post_count качестве параметра post_count тогда некоторые фантастические 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; } }