web-dev-qa-db-fra.com

Commentaires agrégés, avec pagination

Je souhaite créer une page qui affiche tous les commentaires, quel que soit le message auquel ils sont attachés. Je souhaite également que cette page soit paginée, car elle contiendra potentiellement plus de 10 000 commentaires.


Je ne sais pas trop comment s'y prendre, mais voici certaines des fonctions que j'ai étudiées jusqu'à présent:

  1. get_comments - Si aucun post_id n'est passé, tous les commentaires seront renvoyés. Cependant, je ne vois pas de moyen de les paginer (il y a offset et number options pour jouer, mais c'est trèsfastidieux de le faire manuellement).

  2. wp_list_comments - La documentation à ce sujet est assez mauvaise, mais le code source suggère que nous puissions boucler tous les commentaires s’ils sont utilisés avec get_comments, en passant le tableau get_comments comme second argument. Cependant, ceci utiliserait toujours get_comments pour en fait ... eh bien, récupérez les commentaires, et il semble n'y avoir aucun moyen de paginer cela.

  3. previous_comments_link & next_comments_link - Celles-ci ne semblent fonctionner que conjointement avec wp_list_commentssans second argument).

  4. paginate_comments_links - Il semble également que cela ne fonctionne qu'avec wp_list_comments (sans second argument).


Ce que j'ai essayé

  1. En utilisant simplement l'argument number dans get_comments:

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

    Cela n'affiche aucun lien de pagination.

  2. La méthode suggérée ici: Afficher les derniers commentaires en page avec pagination

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

    Cela ne fonctionne pas non plus (il montre les 2 premiers commentaires, mais pas de pagination). De plus, je grince des dents au get_comments en chargeant _ (touscommentaires en mémoire).


Question:

Comment puis-je paginer touscommentaires?


P.S. J'utilise WordPress 3.4.1 & PHP 5.3.2.

6
MegaHit

Très probablement, la principale chose que vous avez manquée est que vous devez cocher la case "Séparer les commentaires en pages" dans le sous-panneau Paramètres de discussion . Les fonctions de pagination exigent que cela soit défini, de même que les réécritures d'URL.

Voici un modèle de page complet et fonctionnel pour faire ce que vous demandez:

<?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(); ?>

Si vous ne voulez pas activer globalement la pagination des commentaires, c'est toujours possible, mais c'est un casse-tête mineur, car vous devrez ajouter manuellement les règles de réécriture. Une fois que vous avez fait cela, vous pouvez tromper WordPress en lui faisant croire que la pagination des commentaires est activée via un simple filtre.

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