WP_User_Query per escludere utenti senza post


9

Vedo che è possibile ordinare una query utente in base al numero di post di ciascun utente, ma è possibile escludere dal risultato gli utenti con zero post? Nella classe Wp_User_Query c'è pre_user_queryun'azione, ma le stringhe di query sono un enorme punto debole, quindi non sono sicuro del tipo di azione di filtro che vorrei usare qui.


Sarebbe meno faticoso scartare semplicemente dai risultati, quegli utenti che sono post_count== 0?
GhostToast,

3
Mi stavo solo preparando a chiudere questa domanda come una domanda totalmente idiota. WordPress lo fa automaticamente con la get_posts_by_author_sqlfunzione che genera l'SQL per la get_authors()query. Gli utenti devono avere un post pubblicato o privato per essere inclusi nei risultati. #facepalm
helgatheviking

Sono contento che tu abbia trovato la risposta
GhostToast,

Anche a me! Sebbene non vi sia alcuna possibilità di chiudere la domanda per motivi di stupidità. Grazie per aver risposto. Applicherò il tuo consiglio perché voglio salvare il get_authors()risultato come transitorio ... quindi posso semplicemente saltare l'autore attuale senza dover fare una domanda ogni volta.
Helgatheviking

1
Questa domanda non è stupida, ha ottenuto voti positivi, si prega di fornire la soluzione come risposta in quanto può aiutare gli altri.
Wyck,

Risposte:


10

Bene, ho escogitato 2 soluzioni.

Soluzione 1: foreach loop e verifica ciascun utente

Questo è basato sulla soluzione di @ GhostToast, ma con funzioni WordPress aggiornate

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

Soluzione 2 - pre_user_queryazione di pantaloni fantasia

Questo è quello a cui stavo pensando quando ho pubblicato la mia domanda una volta trovata l' pre_user_queryazione in WP_User_Queryclasse. Se passi post_countcome orderbyparametro, allora alcune interessanti query SQL che non avrei mai capito da solo capita di unire le tabelle appropriate. Quindi quello che ho fatto è stato copiare quell'istruzione join e aggiungerla alla mia. Sarebbe meglio se potessi verificare la sua presenza prima di aggiungerlo ... forse userò una corrispondenza di stringa in futuro. Ma per ora, dato che sono io a impostare la query, so che non è presente e non me ne preoccuperò ancora. Quindi il codice si è rivelato così:

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

e poi usarlo

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

L'idea per un query_idparametro è tratta da Introduzione a WP_User_Class

Che è anche solo un ottimo riferimento WP_User_Query


1
È adorabile. Ora tutto ciò di cui abbiamo bisogno è un modo per adattare il conteggio delle pagine di impaginazione al nuovo elenco rielaborato ...
Christine Cooper

Ottima scelta. Non so come farlo.
Helgatheviking,

author-> id ora è author-> ID (piccola modifica ma id è deprezzato)
raison

3

Da 4.4, puoi semplicemente usare il parametro `has_published_posts '.

Esempio:

$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_postspuò essere true / false (o null) o una matrice di tipi di post (come in questo esempio).

Nota: sto usando transitori qui perché questa specifica query può diventare piuttosto pesante a seconda del sistema, quindi ha senso memorizzarlo per usi futuri.


0

Invio come risposta per la chiusura:

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

È questa la soluzione alternativa richiesta per ottenere utenti con tutti i ruoli? Sto scoprendo che lasciare quell'argomento vuoto non sta restituendo tutti gli utenti in più siti.
Helgatheviking

get_users_with_role()non è una funzione di WordPress o sto guardando il mio computer da troppo tempo?
Helgatheviking,

1
Non esiste Ricerca di 966 file per "get_users_with_role": 0 matches across 0 files. Inoltre get_usernumpostsè ammortizzato, utilizzarecount_user_posts()
Wyck

Argh! Mie scuse. questa era una funzione che ho scritto per un sito basato sui membri. puoi semplicemente usare get_users () e passare qualsiasi parametro tu voglia: codex.wordpress.org/Function_Reference/get_users
GhostToast

@GhostToast Ti preghiamo di aggiornare la tua risposta.
Kaiser
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.