Ordnen Sie die WordPress-Autoren nach der Anzahl der veröffentlichten benutzerdefinierten Beiträge

Lesezeit: 7 Minuten

Benutzer-Avatar
der König

In meinem WordPress v5.8.1 habe ich eine Liste von Autoren, die in benutzerdefinierten Beiträgen posten song und poem. Mit dem folgenden Code erhalte ich die Liste der Autoren, die in beiden oder in einem benutzerdefinierten Beitrag gepostet haben.

 $authors = get_users(array(
        'who' => 'authors',
        'has_published_posts' => array('song','poem'),
        'orderby' => 'post_count',
        'order' => 'DESC',
        'number' => '15'
 ));

Der folgende Code listet alle Autoren mit ihrer Beitragsanzahl auf:

foreach ($authors as $user) {
   $name = $user->first_name . ' ' . $user->last_name;
   $songs = count_user_posts($user->ID, $post_type = "song");
   $poems = count_user_posts($user->ID, $post_type = "poem");
   echo $name.' has '. $songs .' songs, and '. $poems .' poems;
}

Mit 'orderby' => 'post_count' In den Argumenten habe ich erwartet, dass die Autorenliste mit der höchsten kombinierten Anzahl benutzerdefinierter Posts zuerst angezeigt wird, sie wird jedoch zufällig ohne Reihenfolge angezeigt, weder nach noch nach post_counts Noch ID.

Wie kann ich die Autoren mit den meisten kombinierten Gesamtbeiträgen bestellen?

  • Nur zur Bestätigung – sagen Sie vor Ihrer for-Schleife, dass diese Abfrage nicht nach post_counts sortiert? Wenn Sie diese Abfrage direkt in Ihrer DB ausführen, ist das Ergebnis anders?

    – Pat

    21. Oktober 2021 um 8:55 Uhr

  • Nicht direkt in DB getestet.

    – der König

    21. Oktober 2021 um 12:26 Uhr

  • Ich habe gerade die gleiche Anfrage mit versucht get_users() und diese Parameter mit WordPress 5.8.1 und es hat perfekt funktioniert. Ich habe überprüft, wie die Abfrage im Quellcode vorbereitet ist: Es ist ein riesiges Durcheinander, aber die von Ihnen übergebenen Optionen werden korrekt berücksichtigt.

    – Lagart

    24. Oktober 2021 um 19:06 Uhr

Versuchen Sie den folgenden Code.

$authors = get_users(array(
    'who' => 'authors',
    'has_published_posts' => array('song','poem'),
    'orderby' => 'post_count',
    'order' => 'DESC',
    'number' => '15'
));

Erstelle einen array und zähle das gesamte Gedicht + Lieder

$author_posts = array();

foreach ($authors as $user) {
    $name = $user->first_name . ' ' . $user->last_name;
    $songs = count_user_posts($user->ID, $post_type = "song");
    $poems = count_user_posts($user->ID, $post_type = "poem");
    $author_posts[] = array(
        'total' => $songs+$poems,
        'label' => $name.' has '. $songs .' songs, and '. $poems .' poems'
    );
}

Verwenden Sie jetzt `usort, um ein Array nach Summe zu sortieren.

usort($author_posts, function($a, $b) {
    if($a['total']==$b['total']) return 0;
    return $a['total'] < $b['total']?1:-1;
}); 

Drucken Sie die Ausgabe.

foreach ( $author_posts as $key => $author_post ) {
    echo $author_post['label']."</br>";
}

Vollständiger Code.

$authors = get_users(array(
    'who' => 'authors',
    'has_published_posts' => array('song','poem'),
    'orderby' => 'post_count',
    'order' => 'DESC',
    'number' => '15'
));

$author_posts = array();

foreach ($authors as $user) {
    $name = $user->first_name . ' ' . $user->last_name;
    $songs = count_user_posts($user->ID, $post_type = "song");
    $poems = count_user_posts($user->ID, $post_type = "poem");
    $author_posts[] = array(
        'total' => $songs+$poems,
        'label' => $name.' has '. $songs .' songs, and '. $poems .' poems'
    );
}

usort($author_posts, function($a, $b) {
    if($a['total']==$b['total']) return 0;
    return $a['total'] < $b['total']?1:-1;
}); 

foreach ( $author_posts as $key => $author_post ) {
    echo $author_post['label']."</br>";
}

Getestet und funktioniert.

Benutzer-Avatar
Lagaart

Zuerst die Sortieren nach Argument der Funktion get_users() arbeitet mit post_count zählt aber alle Beitragstypen (hier zählt es Gedicht, Lied und die anderen Typen mögen Post oder Seite).

Wenn Sie Ihre Ergebnisse nach bestimmten benutzerdefinierten Beitragstypen sortieren möchten, würde ich empfehlen, die zu verwenden wpdb Klasse, um Ihre eigene Anfrage zu entwerfen. Auf diese Weise können Sie mit einer einzigen Anfrage genau die gewünschten Ergebnisse erzielen, ohne dass Sie eine verwenden müssen für jeden um Ihre Ergebnisse danach zu sortieren.

Ich habe es auf diese Weise versucht und es hat funktioniert:

$authors = $wpdb->get_results(
    "SELECT
        $wpdb->users.ID AS author_id,
        $wpdb->users.display_name AS author_name,
        COUNT($wpdb->posts.ID) AS published_songs_and_poems,
        COUNT(CASE WHEN $wpdb->posts.post_type="song" THEN $wpdb->posts.ID ELSE NULL END) as published_songs,
        COUNT(CASE WHEN $wpdb->posts.post_type="poem" THEN $wpdb->posts.ID ELSE NULL END) as published_poems
    FROM $wpdb->users
    JOIN $wpdb->posts
        ON $wpdb->posts.post_author = $wpdb->users.ID
        AND $wpdb->posts.post_type IN('song', 'poem') AND $wpdb->posts.post_status="publish"
    GROUP BY author_id
    ORDER BY published_songs_and_poems DESC"
);

Diese Anfrage gibt ein Objekt mit Ergebnissen zurück, gruppiert nach Autor und sortiert nach der Gesamtzahl der veröffentlichten Lieder und Gedichte.

Sie können dieses Objekt verwenden, wie Sie es bereits getan haben. Etwas wie das :

array_walk($authors, function($author) {
    echo $author->author_name." has published ".$author->published_songs." song(s) and ".$author->published_poems." poem(s).<br/>";
});

Ich habe diese Antwort bearbeitet, da sich die erste Version darauf konzentrierte, wie die Ergebnisse in der Reihenfolge der Gesamtsumme zurückgegeben werden post_count. Dies wurde geklärt, als @theKing kommentierte.

  • Es gibt andere benutzerdefinierte Beitragstypen als Lieder und Gedichte in meinem WP; aber hier möchte ich nur Autoren aus kombinierten Liedern & Gedichten zählen.

    – der König

    25. Oktober 2021 um 14:56 Uhr

  • Würde dies nicht eine Abfrage durchführen, um alle Autoren zu erhalten, und dann eine weitere Abfrage für jeden Autor in der Liste?

    – Healyhatman

    28. Oktober 2021 um 1:26 Uhr

  • Danke für die Klarstellung, @theKing. Ich habe gerade meine Antwort bearbeitet. Wie Healyhatman erwähnte, besteht das Risiko mehrerer DB-Anfragen. Aus diesem Grund scheint mir eine individuelle Anfrage der beste Ansatz zu sein.

    – Lagart

    28. Oktober 2021 um 13:18 Uhr

Benutzer-Avatar
Technoh

Sie haben einen Fehler in Ihrem foreach blockieren, könnte dies die Ursache des Problems sein. Verwenden Sie stattdessen Folgendes:

foreach ($authors as $user) {
   $name = $user->first_name . ' ' . $user->last_name;
   $songs = count_user_posts($user->ID, "songs");
   echo $name.' has '. $songs .' songs ';
}

Kurz gesagt, ersetzen Sie die $post_type = "songs" mit einfach "songs". Siehe die Dokumentation für Details zu akzeptierten Parametern.

BEARBEITEN: Ich habe die Frage falsch verstanden. Wenn ich mir Ihre Frage ansehe, ist alles so, wie es sein sollte, also würde ich woanders nach der Ursache des Problems suchen. Haben Sie Plugins oder Filter, die die Abfrage ändern könnten? Kannst du deine Abfrage direkt in der Datenbank reproduzieren und funktioniert sie dort? (um Tabellen- oder Indexkorruption auszuschließen)

  • Es hat nicht geholfen. Mein Problem besteht darin, die Autoren nach ihrer Post-Zählung in der DESC-Reihenfolge zu ordnen. Mit dem aktuellen Code erhalte ich die Anzahl der Beiträge jedes einzelnen Autors.

    – der König

    5. November 2020 um 14:42 Uhr

  • Du hast Recht, ich habe den Punkt deiner Frage völlig verfehlt. Ist die Beitragszählung korrekt? Können Sie dieselbe Abfrage direkt in der Datenbank durchführen und korrekte Ergebnisse erhalten?

    – Techn

    5. November 2020 um 14:52 Uhr


Benutzer-Avatar
Sharanjit Singh

Probier diese:

<?php wp_list_authors( $args ); ?> 



<?php $args = array(
'post_type'     => 'custom_post_type',
'orderby'       => 'post_count', 
'order'         => 'DESC', 
'number'        => null,
'optioncount'   => false, 
'exclude_admin' => true, 
'show_fullname' => false,
'hide_empty'    => true,
'echo'          => true,
'style'         => 'list',
'html'          => true ); ?> 

Ich würde dies mit dem angreifen Abfragemonitor Plugin.

Wie andere vorgeschlagen haben, gibt es einige Gründe, warum dies möglicherweise nicht so funktioniert, wie Sie es erwarten. Einer ist, dass Ihre Abfrage von einem anderen Plugin geändert wird. Ein weiterer Grund ist, dass die Abfrage in Ordnung ist, aber der post_count nicht Ihren Erwartungen entspricht. Um den Dingen auf den Grund zu gehen, müssen Sie genau sehen, was mit Ihrer Abfrage los ist.

Installieren und aktivieren Sie das Query Monitor-Plugin. Laden Sie die Seite, auf der Ihre Abfrage ausgeführt wird, und öffnen Sie dann die Ausgabe des Abfragemonitors. Schauen Sie unter Abfragen nach und scrollen Sie nach unten, um Ihre zu finden. Das zeigt Ihnen die Abfrage, die WordPress ausführt. Überprüfen Sie es und stellen Sie sicher, dass es Ihren Erwartungen entspricht.

Wenn die Abfrage geändert wurde, beginnen Sie mit der Deaktivierung von Plugins, bis Sie den Übeltäter gefunden haben.

Wenn die Abfrage korrekt ist, kopieren Sie sie, gehen Sie zu Ihrer Datenbank (phpmyadmin oder was auch immer Sie verwenden) und führen Sie sie selbst aus. Sie sehen die Ergebnisse direkt aus der Datenbank und es sollte offensichtlich sein, warum die Reihenfolge der Datensätze nicht Ihren Erwartungen entspricht.

1370420cookie-checkOrdnen Sie die WordPress-Autoren nach der Anzahl der veröffentlichten benutzerdefinierten Beiträge

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy