Comment créer une liste paginée de toutes les catégories sur mon site?

9

Je veux afficher une page d'archive avec pagination qui répertorie toutes les catégories sur mon site, et chaque lien va à cette page d'archive de catégorie particulière. Ce serait donc comme une page d'archive d'archives de catégorie.

Chaque catégorie sur mon site a une miniature personnalisée créée manuellement pour correspondre au permalien de la catégorie. J'ai déjà une configuration de mise en page pour afficher toutes les catégories mais je le fais avec un modèle de page personnalisé, donc il n'y a pas de pagination. Cela signifie que toutes les catégories s'affichent sur une seule page, ce qui est un peu ennuyeux (j'ai plus de 100 catégories).

Mon archive actuelle est configurée avec un nom de modèle de page personnalisé spécifique, page-catlist.phpmais je suis prêt à le remplacer par tout autre type de fichier de modèle.

Voici le code actuel que j'utilise pour afficher toutes les catégories sur une seule page:

$args = array(
  'orderby' => 'name',
  'order' => 'ASC'
);
$cats      = get_categories( $args );
$thm_pre   = 'http://example.com/images/thumbs/';
$thm_end   = '.png';

foreach($cats as $cat) {
    $thumbnail = $thm_pre.$cat->slug.$thm_end;
    // output the loop HTML here
    // basically a list of category names & thumbs 
    // all linked to the cat URL by get_category_link()
}

J'espère qu'il y a une meilleure façon de le faire afin que je puisse ajouter une pagination naturelle, idéalement avec WP-PageNavi. Toute aide serait grandement appréciée!

gelleproductions
la source
Ça va être beaucoup d'efforts;)
Sumit
@Sumit c'est en fait assez facile sans aucun effort ;-)
Pieter Goosen

Réponses:

2

La pagination d'une liste de termes / catégories / balises est assez facile, et pour y parvenir, vous avez besoin d'un minimum d'informations.

Regardons ce dont nous avons besoin

  • le montant des termes

  • le nombre de termes par page

  • get_terms()( Notez simplement que l'utilisation de get_terms()a changé dans la version 4.5 ). Vous pouvez également utiliser get_categories()si vous le souhaitez, get_categories()est juste une fonction wrapper pourget_terms()

Nous devons donc d'abord compter le nombre de termes. Pour cela, nous utiliserons le countparamètre dansget_terms()

REMARQUE:

  • Tout le code n'est pas testé et nécessite au moins

    • PHP 5.4

    • WordPress 4.5

Vous pouvez facilement le convertir pour qu'il fonctionne avec les anciennes versions de PHP et WordPress

$taxonomy   = 'category';
$term_count = get_terms( 
    [
        'taxonomy'  => $taxonomy,
        'fields'    => 'count'
    ]
);

Maintenant que nous connaissons le nombre de termes, nous pouvons définir le nombre de termes dont nous avons besoin par page, disons 10

$terms_per_page = 10;

À partir de ce qui précède, nous pouvons maintenant déterminer le nombre de pages que nous aurons. La valeur ici sera transmise à la fonction de pagination requise, dans votre cas, àwp_pagenavi()

$max_num_pages = ceil( $term_count/$terms_per_page );

Dans ce cas, vous passeriez $max_num_pagesà votre fonction de pagination

La prochaine partie serait de calculer notre décalage. Nous voulons uniquement récupérer le nombre de termes pertinents par page pour garder les choses optimisées. Nous n'avons pas besoin de plus de 100 termes par page. Interroger uniquement les 10 nécessaires est beaucoup plus rapide. Donc, nous devons savoir sur quelle page nous sommes, à partir de cela, nous allons calculer un décalage. Ceci sera transmis à get_terms()et indiquera get_terms()le nombre de termes à ignorer à partir du point de départ initial.

Une fois cela fait, il faut aussi dire get_terms()de ne renvoyer que 10 termes. Regardons le code de cette pièce

$current_page = get_query_var( 'paged', 1 ); // Change to 'page' for static front page
$offset       = ( $terms_per_page * $current_page ) - $terms_per_page;
$terms        = get_terms(
    [
        'taxonomy' => $taxonomy,
        'order'    => 'ASC',
        'orderby'  => 'name',
        'number'   => $terms_per_page,
        'offset'   => $offset
    ]
);

Vous n'aurez que 10 termes par page selon la pagination. Vous pouvez maintenant simplement parcourir normalement vos conditions

Juste une note, vous voudrez vous assurer que vous avez bien renvoyé les termes de votre get_terms()fonction.

Pieter Goosen
la source
Cool;) Mais je n'ai pas comment construire de balisage de pagination? wp_pagnavi()fonctionnera vraiment dans ce cas?
Sumit
1
@Sumit, cela fonctionnerait avec next_posts_link(), previous_posts_link()et paginate_links(). Cela fonctionnerait également avec n'importe quelle fonction de pagination où vous pouvez passer une valeur entière à la fonction, comme ma fonction de pagination ici . En ce qui concerne wp_pagenavi(), je ne peux pas dire oui ou non car je n'ai vraiment aucune idée du fonctionnement de cette fonction, vous devrez la tester. Dans mon code ci-dessus, $max_num_pagescontient le nombre de pages, c'est une valeur entière, c'est cette variable que vous devez passer aux fonctions pour calculer la pagination
Pieter Goosen
1
Un merci spécial à vous et à @cjbj car je pense que ces deux solutions pourraient certainement fonctionner. Après avoir regardé autour de moi, j'ai trouvé des informations sur WP-PageNavi expliquant comment cela peut fonctionner ... Certes, il est toujours possible de créer une pagination personnalisée , de toute façon, je pense que ces solutions sont les meilleures.
gelleproductions
1

Je ne suis pas familier avec WP-PageNavi, mais je soupçonne qu'il suppose de traiter des publications, il pourrait donc facilement se gâcher si vous l'utilisez sur une boucle comme la vôtre. Peut-être que le CSS pourrait être utile pour styliser votre html. Quoi qu'il en soit, configurer votre propre pagination n'est pas si difficile.

Tout d'abord, vous devez savoir combien de catégories il y a:

$cat_amounts=count($cats);

Ensuite, vous devez déterminer le nombre d'articles par page que vous souhaitez:

$cats_per_page=20;

Cela vous donnera le nombre de pages:

$max_pages=ceil($cat_amounts/$cats_per_page);

La troisième information dont vous avez besoin est la page sur laquelle vous vous trouvez. Vous pouvez garder une trace de cela en introduisant un query_varVotre URL ressemblera alors à ceci:www.example.com/yourcatpage?catpage=2

Avant de démarrer la boucle, vous devez savoir quelle page est appelée:

$page_called=get_query_var ( $catpage, 1 )

De là, vous pouvez appeler le premier élément que vous souhaitez afficher:

$first_element=($page_called-1)*$cats_per_page)

et la dernière:

$last_element=$page_called*$cats_per_page-1;

La dernière page peut contenir moins de $cats_per_pagecatégories, vous devez donc en plus:

if ($last_element > $cat_amounts) $last_element = $cat_amounts;

Maintenant, parcourez les éléments souhaités de $cats:

for ($i=$first_element;$i=<$last_element;$i++) {
    //do your thing with $cats[$i];
}

Après la boucle, vous pouvez utiliser les variables pour générer des balises précédentes / suivantes ou tout autre type de navigation.

Attention, je n'ai pas réellement testé ce code. J'ai peut-être fait des erreurs en tenant compte du fait que le premier élément d'un tableau a la clé 0.

cjbj
la source
Il y a une approche beaucoup plus facile, plus propre et plus rapide ;-)
Pieter Goosen
En fait, je ne pense pas que nos approches soient si différentes. Vous laissez MySQL gérer l'offset, je laisse à PHP.
cjbj