web-dev-qa-db-fra.com

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

Je souhaite afficher une page d'archive avec une pagination répertoriant toutes les catégories de mon site. Chaque lien permet d'accéder à la page d'archivage de cette catégorie. Donc, cela ressemblerait à une page d'archives d'archives de catégories.

Chaque catégorie de mon site a une vignette 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é, il n'y a donc pas de pagination. Cela signifie que toutes les catégories s'affichent sur une seule page, ce qui est un peu gênant (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.php, mais 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 existe un meilleur moyen de le faire afin d'ajouter une pagination naturelle, idéalement avec WP-PageNavi. Toute aide serait grandement appréciée!

9
gelleproductions

Il est très facile de rechercher une liste de termes/catégories/balises et pour ce faire, vous avez besoin d’un minimum d’informations.

Regardons ce dont nous avons besoin

  • le montant des termes

  • la quantité 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() n’est qu’une fonction wrapper pour get_terms()

Nous devons donc d’abord compter le nombre de termes. Pour cela, nous allons utiliser le paramètre count dans get_terms()

REMARQUE:

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

    • PHP 5.4

    • WordPress 4.5

Vous pouvez facilement convertir cela 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 seulement récupérer le nombre de termes pertinents par page pour que tout soit optimisé. Nous n'avons pas besoin de plus de 100 termes par page. Interroger uniquement le 10 nécessaire est beaucoup plus rapide. Nous avons donc besoin de savoir sur quelle page nous nous trouvons, nous allons calculer un décalage. Ceci sera passé à get_terms() et dira à get_terms() combien de termes doivent être ignorés à partir du point de départ initial.

Une fois que nous avons cela, nous devons également dire à get_terms() de ne renvoyer que 10 termes. Laisse regarder le code pour 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 boucler normalement vos termes

Juste une remarque, vous voudriez vous assurer que les termes sont retournés par votre fonction get_terms().

2
Pieter Goosen

Je ne connais pas bien WP-PageNavi, mais je suppose qu’il suppose qu’il s’agit de posts, cela risque donc de tout gâcher si vous l’utilisez en boucle. Peut-être que les fichiers css pourraient vous aider à styler votre code HTML. Quoi qu'il en soit, mettre en place 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'éléments 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 suivre cela en introduisant un query_var Votre url ressemblera alors à ceci: www.example.com/yourcatpage?catpage=2

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

$page_called=get_query_var ( $catpage, 1 )

À partir de là, vous pouvez appeler le premier élément à 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_page catégories. Vous devez donc:

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

Maintenant, parcourez les éléments désiré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édente/suivante ou un autre type de navigation.

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

1
cjbj