web-dev-qa-db-fra.com

WP_Comment_Query pagination, plonger dans l'inconnu

Je vise la pagination WP_Comment_Query () . Il semble que ce soit un tabou ou qu’il n’existe aucune information viable à ce sujet en ligne , pas autre chose.

Pourquoi? C'est possible? Si oui, comment ?

6
Christine Cooper

Oui, c'est possible, mais c'est un peu pénible.

En regardant la page du codex }, seuls les arguments de note sont number et offset.

Nous avons besoin de ces deux pour créer nos pages paginées.

Tout d’abord, définissons le paramètre $paged, qui correspond à la page actuelle:

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

Puis nombre de commentaires à afficher:

$number = 3;

Après cela, calculez le décalage (où la requête commence à extraire les commentaires):

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

Plaçons-les tous dans la variable arguments:

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

Maintenant, posons la requête et parcourons-la en boucle:

// 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.';

}

Excellent. Nous pouvons maintenant tester l’ajout de /page/2 à la barre d’URL pour vérifier si cela fonctionne, ce qui est le cas.

Il ne manque que l'ajout de liens de pagination, par exemple la fonction next_posts_link().

Le problème est que je n'ai pas trouvé de moyen d'obtenir max_num_pages. Ce qui suit devrait normalement fonctionner dans un WP_Query simple:

$the_query->max_num_pages

Mais ça ne marche pas ici. Sans connaître le nombre maximal de pages, nous ne pouvons pas créer correctement nos liens de pagination. Notez que count($comments) nous donnera uniquement le nombre total de commentaires par page ($number).

Personnellement, j'ai résolu ce problème en calculant le nombre maximal de pages par la requête personnalisée que je ciblais. Je voulais obtenir le nombre total de commentaires par ID utilisateur. J'ai donc utilisé ce numéro comme ceci:

$maximum_pages = $user_total_comments / $number;

Cela fonctionne dans mon cas, mais nous avons certainement besoin d’un moyen d’obtenir max_num_pages. Espérons que, avec cette réponse, il inspirera quelqu'un à résoudre le dernier bit . Au moins, nous avons beaucoup plus d’informations sur la pagination avec wp_comment_query() ici que partout ailleurs.

Mettre à jour

Le problème restant était donc le manque de max_num_pages. Une façon de résoudre ce problème consiste à count() le tableau renvoyé de post et à vérifier s'il correspond au $number (ce que vous avez défini dans la clé de tableau number), voir ci-dessous:

$tot_returned_comments = count($comments);

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

Cela fonctionne dans tous les cas sauf si la dernière page a exactement le même nombre de publications que vous avez défini dans votre variable $number. Donc, si vous définissez $number sur 15 et que votre dernière page paginée contient 15 résultats, le bouton suivant s'affichera.

Maintenant, si vous ne vous souciez pas des performances, vous pouvez facilement exécuter deux requêtes. Un où vous ne limitez pas les résultats et simplement count() les résultats et utilisez ce compte pour la valeur max_num_pages.

Bien que cela ne résolve pas le problème d'obtention de max_num_pages, cela devrait suffire à vous remettre sur pied avec une pagination pleinement fonctionnelle pour wp_comments_query().

8
Christine Cooper

Une autre façon de gérer ce problème consiste à utiliser paginate_links () avec get_comments () (ou toute autre requête similaire). Pour obtenir l'équivalent de max_num_pages, vous pouvez utiliser la fonction intégrée wp_count_comments ().

Ainsi, pour obtenir votre nombre maximum de pages, vous devez d’abord générer un décompte de tous les commentaires souhaités. En supposant que vous ne vouliez pas de commentaires non approuvés:

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

Il est simple de diviser $ all_comments_approved par le nombre de commentaires par page. Donc, avec un "n" commentaires par page:

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

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

(La valeur de $ comments_per_page doit être définie à> 0 et est également utilisée dans la requête de commentaire principale - voir ci-dessous).

La fonction de pagination complète ressemblera à ce qui suit, selon d’autres particularités. (Par exemple: parfois, l'option 'base' sera rendue plus délicate par la présence de variables de requête dans l'URL. J'ai dû utiliser un preg_replace pour résoudre ce problème dans une application.)

$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
));

... et le reste met en forme la sortie ... et la requête de commentaire principale. Ce dernier ressemblera à ceci: Notez que $ comments_per_page est essentiel à la fois pour le nombre de commentaires récupérés et pour le calcul du décalage. Notez également que la taille totale de l'objet récupéré est limitée par le nombre (ainsi que par 'statut').

$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