it-swarm.com.de

Aggregierte Kommentare mit Paginierung

Ich möchte eine Seite erstellen, auf der alle Kommentare angezeigt werden, unabhängig davon, an welchen Beitrag sie angehängt sind. Ich möchte auch, dass diese Seite paginiert wird, da sie möglicherweise mehr als 10.000 Kommentare enthält.


Ich bin nicht sicher, wie ich vorgehen soll, aber hier sind einige der Funktionen, die ich bisher studiert habe:

  1. get_comments - Wenn kein post_id übergeben wird, werden alle Kommentare zurückgegeben. Ich sehe jedoch keine Möglichkeit, diese zu paginieren (es gibt Optionen für offset und number, mit denen man experimentieren kann, aber das ist sehr mühsam manuell zu tun).

  2. wp_list_comments - Die Dokumentation dazu ist ziemlich schlecht, aber der Quellcode legt nahe, dass wir alle Kommentare in Verbindung mit get_comments durchlaufen können, indem wir als zweites Argument das Array get_comments übergeben. Dies würde jedoch immer noch get_comments verwenden, um tatsächlich ... naja, die Kommentare zu erhalten, und es scheint keine Möglichkeit zu geben, das zu paginieren.

  3. previous_comments_link & next_comments_link - Diese scheinen nur in Verbindung mit wp_list_comments zu funktionieren (ohne zweites Argument).

  4. paginate_comments_links - Sieht auch so aus, als würde es nur mit wp_list_comments funktionieren (ohne zweites Argument).


Was ich versucht habe:

  1. Verwenden Sie einfach das Argument number in get_comments:

    $comments = get_comments(array(
        'status'    => 'approve',
        'number'    => '2'
    ));
    
    wp_list_comments(array(
        'callback' => 'my_rendering_function'
    ), $comments);
    
    paginate_comments_links();
    

    Dies zeigt keine Paginierungslinks an.

  2. Die hier vorgeschlagene Methode: Neueste Kommentare auf Seite mit Paginierung anzeigen

    $comments = get_comments(array(
        'status' => 'approve'
    ));
    
    wp_list_comments('per_page=2', $comments);
    
    paginate_comments_links();
    

    Dies funktioniert auch nicht (es zeigt die ersten 2 Kommentare, aber keine Paginierung). Außerdem erschaudere ich, wenn get_commentsalle Kommentare in den Speicher lädt.


Frage:

Wie kann ich alle Kommentare paginieren?


P.S. Ich benutze WordPress 3.4.1 & PHP 5.3.2.

6
MegaHit

Das Wichtigste, das Sie verpasst haben, ist höchstwahrscheinlich, dass "Kommentare in Seiten aufteilen" im Diskussionsunterfenster "Einstellungen" markiert ist. Für die Paginierungsfunktionen muss dies festgelegt werden, ebenso wie für das Umschreiben der URL.

Hier ist eine funktionierende, vollständige Seitenvorlage, mit der Sie Ihre Anforderungen erfüllen können:

<?php
/*
Template Name: All Comments
See http://wordpress.stackexchange.com/questions/63770/aggregate-comments-with-pagination
*/
get_header(); ?>

<div id="content" role="main">

    <?php
    # The comment functions use the query var 'cpage', so we'll ensure that's set
    $page = intval( get_query_var( 'cpage' ) );
    if ( 0 == $page ) {
        $page = 1;
        set_query_var( 'cpage', $page );
    }

    # We'll do 10 comments per page...
    # Note that the 'page_comments' option in /wp-admin/options-discussion.php must be checked
    $comments_per_page = 10;
    $comments = get_comments( array( 'status' => 'approve' ) );
    ?>
    <ol start="<?php echo $comments_per_page * $page - $comments_per_page + 1 ?>">
        <?php wp_list_comments( array (
            'style' => 'ol',
            'per_page' => $comments_per_page,
            'page' => $page,
            'reverse_top_level' => false
        ), $comments ); ?>
    </ol>

    <?php # Now you can either use paginate_comments_links ... ?>
    <?php paginate_comments_links() ?>

    <?php # Or you can next/prev yourself... ?>
    <?php if ( get_comment_pages_count( $comments, $comments_per_page ) > 1 ) : // are there comments to navigate through ?>
    <nav id="comment-nav">
        <div class="nav-previous"><?php previous_comments_link( __( '&larr; Newer Comments' ) ); ?></div>
        <div class="nav-next"><?php next_comments_link( __( 'Older Comments &rarr;' ) ); ?></div>
    </nav>
    <?php endif; ?>

</div><!-- #content -->

<?php get_sidebar(); ?>
<?php get_footer(); ?>

Wenn Sie die Kommentarseite nicht global aktivieren möchten, ist dies immer noch möglich, verursacht jedoch geringfügige Kopfschmerzen, da Sie die Umschreiberegeln manuell hinzufügen müssen. Sobald Sie dies getan haben, können Sie WordPress täuschen und glauben, dass die Kommentarseite über einen einfachen Filter aktiviert ist.

add_filter( 'pre_option_page_comments', '__return_true' );
4
Matthew Boynes