it-swarm.com.de

WP_Comment_Query Paginierung, Eintauchen ins Unbekannte

Ich versuche zu paginieren WP_Comment_Query () . Es scheint, dass dies entweder tabu ist oder dass es keine brauchbaren Informationen darüber gibt online , nichts.

Warum? Ist es möglich? Wenn ja, wie ?

6

Ja, das ist möglich, aber es ist ein bisschen schmerzhaft.

Auf der Codex-Seite sind nur die Argumente number und offset von Bedeutung.

Wir brauchen diese beiden, um unsere Seiten mit Seitenumbrüchen zu erstellen.

Zuerst setzen wir den Parameter $paged, der die aktuelle Seite ist:

$paged = ( get_query_var( 'paged' ) ) ? get_query_var( 'paged' ) : 1;

Dann Anzahl der anzuzeigenden Kommentare:

$number = 3;

Berechnen Sie anschließend den Offset (wo die Abfrage Kommentare abruft):

$offset = ( $paged - 1 ) * $number;

Platzieren wir sie alle in der Variablen arguments:

// arguments to filter comments
$args = array(
    'number' => $number,
    'offset' => $offset,
    'paged' => $paged
);

Lassen Sie uns nun die Abfrage treffen und sie durchlaufen:

// the query
$the_query = new WP_Comment_Query;
$comments = $the_query->query( $args );

// Comment Loop
if ( $comments ) {

    foreach ( $comments as $comment ) {
        echo '<p>' . $comment->comment_content . '</p><br><br>';
    }

} else {

    echo 'No comments found.';

}

Ausgezeichnet. Jetzt können wir testen, ob /page/2 zur URL-Leiste hinzugefügt wird, um zu überprüfen, ob es funktioniert.

Das einzige, was fehlt, ist das Hinzufügen von Paginierungslinks, zum Beispiel die Funktion next_posts_link().

Das Problem ist, dass ich keinen Weg gefunden habe, max_num_pages zu bekommen. In einer einfachen WP_Query würde normalerweise Folgendes funktionieren:

$the_query->max_num_pages

Aber hier funktioniert es nicht. Ohne die maximale Anzahl von Seiten zu kennen, können wir unsere Paginierungslinks nicht richtig erstellen. Beachten Sie, dass count($comments) nur die Gesamtzahl der Kommentare pro Seite ($number) ausgibt.

Persönlich habe ich dies behoben, indem ich die maximale Anzahl von Seiten anhand der benutzerdefinierten Abfrage berechnet habe, auf die ich abzielte. Ich wollte die Gesamtzahl der Kommentare nach Benutzer-ID abrufen. Also habe ich diese Nummer so benutzt:

$maximum_pages = $user_total_comments / $number;

Dies funktioniert in meinem Fall, aber wir brauchen definitiv einen Weg, um max_num_pages zu bekommen. Hoffentlich wird es mit dieser Antwort jemanden dazu inspirieren, das letzte Bit zu lösen . Zumindest haben wir hier viel mehr Informationen über die Paginierung mit wp_comment_query() als anderswo.

Aktualisieren

Das verbleibende Problem war also das Fehlen von max_num_pages. Eine Möglichkeit, dies zu lösen, besteht darin, das zurückgegebene Post-Array zu count() und zu prüfen, ob es mit dem $number übereinstimmt (was Sie im Array-Schlüssel number festgelegt haben). Siehe unten:

$tot_returned_comments = count($comments);

if ($number == $tot_returned_comments) {
    echo '<a href="/comments/page/' . $nextpage . '">Next</a>';
}

Dies funktioniert in allen Fällen, außer wenn die letzte Seite genau so viele Beiträge enthält, wie Sie in Ihrer $number -Variable festgelegt haben. Wenn Sie also $number auf 15 setzen und Ihre letzte paginierte Seite 15 Ergebnisse hat, wird die nächste Schaltfläche angezeigt.

Wenn Ihnen die Leistung nicht wichtig ist, können Sie problemlos zwei Abfragen ausführen. Eine, bei der Sie die Ergebnisse und einfach die count() -Ergebnisse nicht einschränken und diese Anzahl für den max_num_pages-Wert verwenden.

Dies behebt zwar nicht den Mangel an max_num_pages, sollte aber ausreichen, um Sie mit einer voll funktionsfähigen Paginierung für wp_comments_query() auf die Beine zu stellen.

8

Die alternative Möglichkeit, dieses Problem zu lösen, besteht darin, paginate_links () mit get_comments () (oder einer ähnlichen Abfrage) zu verwenden. Um das Äquivalent von max_num_pages zu erhalten, können Sie die integrierte Funktion wp_count_comments () verwenden.

Um die maximale Anzahl von Seiten zu erhalten, müssen Sie zunächst alle gewünschten Kommentare zählen. Vorausgesetzt, Sie möchten keine nicht genehmigten Kommentare:

$all_comments = wp_count_comments();
$all_comments_approved = $all_comments->approved;

Es ist ganz einfach, $ all_comments_approved durch die Anzahl der Kommentare pro Seite zu dividieren. Also, mit einem gewünschten "n" Kommentare pro Seite:

//Adding one at the end as simple way of rounding up. 

$max_num_pages = intval( $all_comments_approved / $comments_per_page ) + 1;  

(Der Wert von $ comments_per_page sollte auf> 0 voreingestellt sein und wird auch in der Hauptkommentarabfrage verwendet - siehe unten).

Die vollständige Paginierungsfunktion sieht in Abhängigkeit von anderen Details wie folgt aus. (Zum Beispiel: Manchmal wird die Option 'base' durch das Vorhandensein von Abfragevariablen in der URL schwieriger. Ich musste preg_replace verwenden, um dieses Problem in einer Anwendung zu umgehen.)

$current_page = max(1, get_query_var('paged'));

echo paginate_links(array(
        //check codex for how to work with get_pagenum_link and variations
        'base' => get_pagenum_link(1) . '%_%',
        'current' => $current_page,
        'total' => $max_num_pages,
        'prev_text' => __('&laquo; Previous'),
        'next_text' => __('Next &raquo;'),
        'end_size' => 2,
        'mid-size' => 3
));

... und der Rest formatiert die Ausgabe ... und die Hauptkommentarabfrage. Letzteres sieht folgendermaßen aus: Beachten Sie, dass $ comments_per_page hier sowohl für die Anzahl der abgerufenen Kommentare als auch für die Berechnung des Offsets von entscheidender Bedeutung ist. Beachten Sie auch, dass die Gesamtgröße des abgerufenen Objekts durch die Anzahl (sowie durch den Status) begrenzt ist.

$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
$offset = ($paged - 1) * $comments_per_page;


$comments = get_comments(array(
'status' => 'approve',
'number' => $comments_per_page,
'offset' => $offset
));
3
CK MacLeod