WP_User_Query, aby wykluczyć użytkowników bez postów

9

Widzę, że możliwe jest sortowanie zapytania użytkownika według liczby postów każdego użytkownika, ale czy można wykluczyć użytkowników z zerowymi wpisami z wyniku? W klasie Wp_User_Query jest pre_user_queryakcja, ale ciągi zapytania są ogromną słabą stroną, więc nie jestem pewien, jakiego rodzaju działania filtrującego chciałbym tutaj użyć.

helgatheviking
źródło
Czy opodatkowanie byłoby po prostu odrzuceniem wyników, tych użytkowników, którzy post_count== 0?
GhostToast,
3
Właśnie przygotowywałem się do zamknięcia tego jako całkowicie kretyńskiego pytania. WordPress robi to automatycznie za pomocą get_posts_by_author_sqlfunkcji, która generuje SQL dla get_authors()zapytania. Użytkownicy muszą mieć opublikowany lub prywatny post, aby uwzględnić je w wynikach. #facepalm
helgatheviking
fajnie, cieszę się, że znalazłeś odpowiedź
GhostToast,
Ja też! Chociaż nie ma możliwości zamknięcia pytania z powodu głupoty. Dziękuję, że wpadłeś. Zastosuję twoją radę, ponieważ chcę zapisać get_authors()wynik jako przejściowy ... wtedy mogę po prostu pominąć obecnego autora bez konieczności każdorazowego zapytania.
helgatheviking
1
To pytanie nie jest głupie, ma pozytywne opinie, proszę podać swoje rozwiązanie jako odpowiedź, ponieważ może pomóc innym.
Wyck,

Odpowiedzi:

10

Cóż, wymyśliłem 2 rozwiązania.

Rozwiązanie 1 - foreach loop i zweryfikuj każdego użytkownika

Ten oparty jest na rozwiązaniu @ GhostToast, ale ze zaktualizowanymi funkcjami 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"; 
}

Rozwiązanie 2 - fantazyjne pre_user_querydziałanie spodni

Właśnie o tym myślałem, kiedy zadałem pytanie, gdy znalazłem pre_user_queryakcję w WP_User_Queryklasie. Jeśli podasz post_countjako orderbyparametr, wówczas jakieś fantazyjne zapytania SQL, których nigdy bym nie odkrył, łączą ze sobą odpowiednie tabele. Więc to, co zrobiłem, to skopiuj tę instrukcję dołączenia i dodaj ją do mojej. Byłoby lepiej, gdybym mógł najpierw sprawdzić jego obecność przed dodaniem ... być może użyję dopasowania ciągu w przyszłości. Ale na razie, ponieważ to ja konfiguruję zapytanie, wiem, że go nie ma i po prostu nie będę się tym martwić. Kod okazał się więc taki:

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');

a następnie go użyć

$args = ( array( 'query_id' => 'authors_with_posts' ) );  
$author_query = new WP_User_Query( $args );

Pomysł na query_idparametr pochodzi z An Introduction to WP_User_Class

Co jest również bardzo dobrym odniesieniem WP_User_Query

helgatheviking
źródło
1
To jest urocze. Teraz wszystko, czego potrzebujemy, to sposób dostosowania liczby stronicowania do nowej, przerobionej listy ...
Christine Cooper
Dobra decyzja. Nie wiem jak to zrobić.
helgatheviking
autor-> identyfikator jest teraz autorem-> identyfikator (mała zmiana, ale identyfikator jest nieaktualny)
raison
3

Od wersji 4.4 możesz po prostu użyć parametru `has_published_posts '.

Przykład:

$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_postsmoże mieć wartość true / false (lub null) lub tablicę typów postów (jak w tym przykładzie).

Uwaga: Używam tutaj stanów nieustalonych, ponieważ to konkretne zapytanie może być dość ciężkie w zależności od systemu, więc sensowne jest przechowywanie go do przyszłych zastosowań.

pixeline
źródło
0

Przekazanie jako odpowiedź na zamknięcie:

   $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
źródło
Czy to obejście jest wymagane, aby uzyskać użytkowników wszystkich ról? Uważam, że pozostawienie tego argumentu pustego nie powoduje zwrócenia wszystkich użytkowników w wielu miejscach.
helgatheviking
get_users_with_role()nie jest funkcją WordPress lub czy patrzyłem na komputer zbyt długo?
helgatheviking
1
Nie istnieje Wyszukiwanie 966 plików w poszukiwaniu "get_users_with_role": 0 matches across 0 files. get_usernumpostsJest również amortyzowany, użyjcount_user_posts()
Wyck
argh! przepraszam. to była funkcja, którą napisałem dla witryny opartej na członkach. możesz po prostu użyć get_users () i przekazać dowolne parametry: codex.wordpress.org/Function_Reference/get_users
GhostToast
@GhostToast Zaktualizuj swoją odpowiedź.
kaiser,