web-dev-qa-db-fra.com

WP_User_Query pour exclure les utilisateurs sans publication

Je vois qu’il est possible de trier une requête d’utilisateur en fonction du nombre de publications de chaque utilisateur, mais est-il possible d’exclure du résultat les utilisateurs avec zéro publication? Dans la classe Wp_User_Query, il existe une action pre_user_query, mais les chaînes de requête constituent un gros point faible. Je ne suis donc pas sûr du type d'action de filtrage que je voudrais utiliser ici.

9
helgatheviking

Eh bien, je suis venu avec 2 solutions.

Solution 1 - foreach boucle et vérifiez chaque utilisateur

Celui-ci est basé sur la solution de @ GhostToast, mais avec des fonctions WordPress mises à jour

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

Solution 2 - pantalons de fantaisie pre_user_query action

C'est ce à quoi je pensais lorsque j'ai posté ma question une fois que j'ai trouvé l'action pre_user_query dans la classe WP_User_Query. Si vous transmettez post_count en tant que paramètre orderby, des requêtes SQL sophistiquées que je n'aurais jamais imaginées par moi-même arrivent à joindre les tables appropriées. Donc, ce que j'ai fait était de copier cette déclaration de jointure et de l'ajouter à la mienne. Ce serait mieux si je pouvais vérifier sa présence avant de l'ajouter ... J'utiliserai peut-être une correspondance de chaîne à l'avenir. Mais pour l'instant, puisque c'est moi qui suis en train de configurer la requête, je sais qu'elle n'est pas là et que je ne m'en soucierai pas pour le moment. Donc, le code s'est avéré comme suit:

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

et ensuite l'utiliser

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

L'idée d'un paramètre query_id provient de Introduction à WP_User_Class

Ce qui est aussi juste une très bonne référence sur WP_User_Query

10
helgatheviking

Depuis 4.4, vous pouvez simplement utiliser le paramètre `has_published_posts '.

Exemple:

$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_postspeut être true/false (ou null) ou un tableau de types de publication (comme dans cet exemple).

Remarque: j'utilise des transitoires ici car cette requête spécifique peut devenir assez lourde en fonction du système. Il est donc logique de la stocker pour de futures utilisations.

3
pixeline

Soumettre comme réponse pour clôture:

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