WP_User_Query pour exclure les utilisateurs sans publication

9

Je vois qu'il est possible de trier une requête utilisateur en fonction du nombre de publications de chaque utilisateur, mais est-il possible d'exclure des utilisateurs sans publication du résultat? Dans la classe Wp_User_Query, il y a une pre_user_queryaction, mais les chaînes de requête sont un énorme point faible, donc je ne sais pas quel type d'action de filtrage je voudrais utiliser ici.

helgatheviking
la source
Serait-il moins pénible de simplement rejeter des résultats, ces utilisateurs qui sont post_count== 0?
GhostToast
3
J'étais sur le point de clore cette question comme une question complètement débile. WordPress le fait automatiquement avec la get_posts_by_author_sqlfonction qui génère le SQL pour la get_authors()requête. Les utilisateurs doivent avoir un article publié ou privé pour être inclus dans les résultats. #facepalm
helgatheviking
cool heureux d'avoir trouvé la réponse
GhostToast
Moi aussi! Bien qu'il n'y ait pas d'option pour fermer la question pour des raisons de stupidité. Merci d'avoir sonné. J'appliquerai votre conseil parce que je veux enregistrer le get_authors()résultat en tant que transitoire ... alors je peux simplement ignorer l'auteur actuel sans avoir besoin de faire une requête à chaque fois.
helgatheviking
1
Cette question n'est pas stupide, elle a obtenu des votes positifs, veuillez fournir votre solution comme réponse car elle peut aider les autres.
Wyck

Réponses:

10

Eh bien, j'ai trouvé 2 solutions.

Solution 1 - foreach boucle et vérifier 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 - pre_user_queryAction de pantalon fantaisie

C'est à cela que je pensais quand j'ai posté ma question une fois que j'ai trouvé l' pre_user_queryaction en WP_User_Queryclasse. Si vous passez en post_counttant que orderbyparamètre, alors certaines requêtes SQL fantaisistes que je n'aurais jamais imaginées moi-même arrivent à joindre les tables appropriées. J'ai donc copié cette déclaration de jointure et l'ajoutée à la mienne. Ce serait mieux si je pouvais d'abord vérifier sa présence avant de l'ajouter ... peut-être que j'utiliserai une correspondance de chaîne à l'avenir. Mais pour l'instant puisque c'est moi qui configure la requête, je sais qu'elle n'est pas là et je ne m'en inquiéterai pas encore. 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');

puis de l'utiliser

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

L'idée d'un query_idparamètre est tirée d'une introduction à WP_User_Class

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

helgatheviking
la source
1
C'est adorable. Maintenant, tout ce dont nous avons besoin est un moyen d'ajuster le nombre de pages de pagination à la nouvelle liste retravaillée ...
Christine Cooper
Bon appel. Je ne sais pas comment faire ça.
helgatheviking
author-> id est maintenant author-> ID (petite modification mais id est déprécié)
raison
3

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 soit vrai / faux (ou nul), soit un tableau de types de messages (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 judicieux de la stocker pour de futures utilisations.

pixeline
la source
0

Soumettre comme réponse à la 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;
        }
    }
GhostToast
la source
Est-ce la solution de contournement requise pour obtenir des utilisateurs de tous les rôles? Je trouve que laisser cet argument vide ne renvoie pas tous les utilisateurs en multisite.
helgatheviking
get_users_with_role()n'est pas une fonction WordPress ou ai-je regardé mon ordinateur trop longtemps?
helgatheviking
1
Cela n'existe pas. Recherche de 966 fichiers "get_users_with_role": 0 matches across 0 files. Est également get_usernumpostsamorti, utilisezcount_user_posts()
Wyck
argh! mes excuses. c'était une fonction que j'ai écrite pour un site basé sur les membres. vous pouvez simplement utiliser get_users () et passer les paramètres que vous voulez: codex.wordpress.org/Function_Reference/get_users
GhostToast
@GhostToast Veuillez simplement mettre à jour votre réponse.
kaiser