WP_User_Query zum Ausschließen von Benutzern ohne Beiträge

9

Ich sehe, dass es möglich ist, eine Benutzerabfrage nach der Anzahl der Beiträge jedes Benutzers zu sortieren. Ist es jedoch möglich, Benutzer mit null Beiträgen vom Ergebnis auszuschließen? In der Wp_User_Query-Klasse gibt es eine pre_user_queryAktion, aber Abfragezeichenfolgen stellen eine große Schwachstelle dar. Daher bin ich mir nicht sicher, welche Art von Filteraktion ich hier verwenden möchte.

Helgatheviking
quelle
Wäre es weniger anstrengend, die Benutzer, die post_count== 0 sind , einfach aus den Ergebnissen zu streichen?
GhostToast
3
Ich war gerade dabei, dies als eine total schwachsinnige Frage zu schließen. WordPress tut dies automatisch mit der get_posts_by_author_sqlFunktion, die das SQL für die get_authors()Abfrage generiert . Benutzer müssen über einen veröffentlichten oder privaten Beitrag verfügen, um in die Ergebnisse aufgenommen zu werden. #facepalm
helgatheviking
cool froh, dass du die Antwort gefunden hast
GhostToast
Ich auch! Es gibt jedoch keine Möglichkeit, die Frage aus Gründen der Dummheit zu schließen. Vielen Dank, dass Sie sich angemeldet haben. Ich werde Ihren Rat anwenden, weil ich das get_authors()Ergebnis als vorübergehend speichern möchte ... dann kann ich einfach den aktuellen Autor überspringen, ohne jedes Mal eine Abfrage durchführen zu müssen.
Helgatheviking
1
Diese Frage ist nicht dumm, sie hat positive Stimmen erhalten. Bitte geben Sie Ihre Lösung als Antwort an, da sie anderen helfen kann.
Wyck

Antworten:

10

Nun, ich habe 2 Lösungen gefunden.

Lösung 1 - foreach Schleife und überprüfen Sie jeden Benutzer

Dieser basiert auf der @ GhostToast-Lösung, jedoch mit aktualisierten WordPress-Funktionen

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

Lösung 2 - Fancy Pants pre_user_queryAktion

Daran habe ich gedacht, als ich meine Frage gestellt habe, als ich die pre_user_queryAktion in der WP_User_QueryKlasse gefunden habe. Wenn Sie post_countals orderbyParameter übergeben, verbindet eine ausgefallene SQL-Abfrage, die ich selbst nie herausgefunden hätte, die richtigen Tabellen miteinander. Also habe ich diese Join-Anweisung kopiert und zu meiner eigenen hinzugefügt. Dies wäre besser, wenn ich zuerst prüfen könnte, ob es vorhanden ist, bevor ich es hinzufüge ... Vielleicht werde ich in Zukunft eine Zeichenfolgenübereinstimmung verwenden. Aber jetzt, da ich derjenige bin, der die Abfrage erstellt, weiß ich, dass sie nicht vorhanden ist und ich werde mich noch nicht darum kümmern. Der Code stellte sich also so heraus:

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

und dann zu benutzen

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

Die Idee für einen query_idParameter stammt aus einer Einführung in WP_User_Class

Welches ist auch nur eine sehr gute Referenz auf WP_User_Query

Helgatheviking
quelle
1
Das ist schön. Jetzt brauchen wir nur noch eine Möglichkeit, die Anzahl der Paginierungsseiten an die neue überarbeitete Liste anzupassen ...
Christine Cooper
Guter Anruf. Ich weiß nicht, wie ich das machen soll.
Helgatheviking
Autor-> ID ist jetzt Autor-> ID (kleine Änderung, aber ID wird abgeschrieben)
Existenzberechtigung
3

Seit 4.4 können Sie einfach den Parameter `has_published_posts 'verwenden.

Beispiel:

$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_postskann entweder wahr / falsch (oder null) oder ein Array von Beitragstypen sein (wie in diesem Beispiel).

Hinweis: Ich verwende hier Transienten, da diese spezielle Abfrage je nach System sehr umfangreich werden kann. Daher ist es sinnvoll, sie für zukünftige Verwendungen zu speichern.

Pixeline
quelle
0

Einreichung als Antwort für den Abschluss:

   $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
quelle
Ist das die Problemumgehung, die erforderlich ist, um Benutzer aller Rollen zu erhalten? Ich stelle fest, dass das Leerlassen dieses Arguments nicht alle Benutzer in Multisite zurückgibt.
Helgatheviking
get_users_with_role()ist keine WordPress-Funktion oder habe ich zu lange auf meinen Computer geschaut?
Helgatheviking
1
Es existiert nicht. 966 Dateien suchen nach "get_users_with_role": 0 matches across 0 files. Auch get_usernumpostswird abgeschrieben, verwendencount_user_posts()
Wyck
argh! Entschuldigen Sie. Dies war eine Funktion, die ich für eine auf Mitgliedern basierende Site geschrieben habe. Sie können einfach get_users () verwenden und die gewünschten Parameter übergeben: codex.wordpress.org/Function_Reference/get_users
GhostToast
@GhostToast Bitte aktualisieren Sie einfach Ihre Antwort.
Kaiser