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ć.


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


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ń.


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

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,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.