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:
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).
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.
previous_comments_link
& next_comments_link
- Celles-ci ne semblent fonctionner que conjointement avec wp_list_comments
sans second argument).
paginate_comments_links
- Il semble également que cela ne fonctionne qu'avec wp_list_comments
(sans second argument).
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.
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).
Comment puis-je paginer touscommentaires?
P.S. J'utilise WordPress 3.4.1 & PHP 5.3.2.
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( __( '← Newer Comments' ) ); ?></div>
<div class="nav-next"><?php next_comments_link( __( 'Older Comments →' ) ); ?></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' );