WP_User_Query, щоб виключити користувачів без публікацій


9

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


Чи не буде меншим оподаткуванням просто відмовитися від результатів тих користувачів, які мають post_count== 0?
GhostToast

3
Я тільки готувався закрити це як цілком глузливе питання. WordPress робить це автоматично за допомогою get_posts_by_author_sqlфункції, яка генерує SQL для get_authors()запиту. Користувачі повинні мати опубліковану або приватну публікацію для включення в результати. #facepalm
helgatheviking

приємно радий, що ти знайшов відповідь
GhostToast

Я також! Хоча немає можливості закрити питання з причини дурості. Дякуємо за курацію, хоча. Я застосую вашу пораду, тому що хочу зберегти get_authors()результат як перехідний ... тоді я можу просто пропустити поточного автора, не потребуючи щоразу робити запит.
helgatheviking

1
Це питання не дурне, воно отримало відгуки, будь ласка, надайте своє рішення як відповідь, оскільки це може допомогти іншим.
Вік

Відповіді:


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


1
Це прекрасно. Тепер все, що нам потрібно, - це налаштувати кількість сторінок сторінки на новий перероблений список ...
Крістін Купер

Гарний дзвінок. Не знаю, як це зробити.
helgatheviking

author-> id now author-> ID (незначна зміна, але ідентифікатор знецінений)
raison

3

Починаючи з 4.4, ви можете просто скористатися параметром `has_publisher_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), або масив типів публікацій (як у цьому прикладі).

Примітка. Тут я використовую перехідні процеси, оскільки цей конкретний запит може бути досить важким залежно від системи, тому є сенс зберігати його для подальшого використання.


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;
        }
    }

Це рішення потрібно для отримання користувачів усіх ролей? Я вважаю, що залишити цей аргумент порожнім - це не повернути всіх користувачів на багатосайтовій основі.
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 Будь ласка, просто оновіть свою відповідь.
кайзер
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.