Problématique :
Il est fréquent d’avoir besoin d’afficher de manière différente le contenu des catégories d’un site. La catégorie Portfolio de ce site, par exemple, s’affichera d’une autre façon que la catégorie WordPress.
La solution la plus simple :
Le plus facile à mettre en œuvre consiste à utiliser les templates category-{id}.php ou category-{slug}.php tel que prévu dans le tableau de hiérarchie des templates de WordPress.
(Pour plus d’information à ce sujet, je vous invite vivement à consulter le codex, c’est une ressource indispensable pour bien comprendre le développement WordPress)
Il s’agit simplement de créer un fichier par catégorie, nommé category-{id}.php ou category-{slug}.php. Il faut bien évidemment remplacer {id} par l’ID de votre catégorie, et {slug} par le slug (en français il s’agit du champs ‘identifiant’, utilisé entre autre pour la génération des permaliens).
Dans le cas du site que vous consultez actuellement, le fichier correspondant à la catégorie Portfolio s’appellerait donc category-5.php ou category-portfolio.php.
Cette méthode est très simple à mettre en place. Elle souffre cependant d’un gros inconvénient : si vous voulez afficher d’une même façon plusieurs catégories, vous serez obligé de dupliquer vos fichier de template en les renommant de façon adéquate. Rien de très orthodoxe si vous attachez une quelconque importance à l’optimisation de votre code.
Elle se révèle toutefois très pratique si vous êtes certain qu’un seul type d’affichage sera utilisé par catégorie, sachant que vous utiliserez probablement un fichier category.php pour un affichage par défaut.
Une solution plus évoluée :
Afin de ne pas être obligé de dupliquer inutilement des templates dans le cas où vous souhaiteriez développer différents types d’affichages de catégories, la solution consiste à créer un seul fichier par type de template, et à répartir ceux-ci en faisant un switch de l’id de la catégorie dans le fichier category.php.
Voici à quoi ressemblerait un tel fichier :
L’avantage principal de cette solution est qu’il n’est plus nécessaire de dupliquer de fichier de templates. Un gros inconvénient reste : chaque ajout d’une catégorie susceptible d’être affichée autrement que par le fichier template-cat-default.php (ou tout autre manière dont vous l’aurez nommé) nécessite de modifier légèrement le fichier category.php.
Il est bien évidemment impossible de livrer un site construit de cette manière à un client, si on souhaite que celui-ci puisse être totalement autonome.
La solution ultime :
L’idéal serait bien évidemment d’avoir un champs associé à chaque catégorie, et permettant d’y définir le template à utiliser.
Si le champs « description » d’une catégorie n’est pas utilisé, vous pouvez vous en servir à cet effet. Dans le cas contraire, le plugin Category Meta plugin devrait résoudre votre problème, en vous permettant d’ajouter un (ou plusieurs) meta à vos catégories.
Il ne reste alors qu’à utiliser les templates category.php et single.php pour rediriger vers les templates personnalisés de votre choix, en prenant bien évidemment garde à définir un template par défaut.
Dans l’exemple ci-dessous, j’ai nommé mon meta « type » :
Fichier category.php :
Et l’équivalent pour le single.php :
Cette méthode ne présente que des avantages :
- Aucune duplication de fichiers
- Possibilité d’ajouter autant de catégories que l’on souhaite en définissant simplement le template utilisé par celles-ci
- Possibilité d’ajouter un nouveau type de template en créant simplement les fichiers associés aux meta « type » créées
Et vous, quelle(s) méthode(s) utilisez vous pour gérer l’affichage de vos catégories ?
Bonjour
J’aime beaucoup cette article très prometteur.
Etant débutant j’ai par contre beaucoup de difficulté à le comprendre. Une vidéo de la manipulation ou même quelques images de plus ne serait pas de refus. Je pense également à liens vers d’autres tuto expliquant comment en arriver là.
J’aimerais expliquer ce que je ne comprends pas dans cette article mais je n’arrive même pas à l’identifier. D’où sort le fichier category-1.php ? je dois le créer ? mon theme gère la façon d’afficher les post, à quel moment je dois signaler quelle disposition du thème j’utilise?
est ce que je dois créer ou utiliser les fichiers single.php et category.php ? existent ils ? où les trouver ?
SVP répondez moi je reviendrais voir les réponses j’ai mis le site en favori
Bonjour,
Merci beaucoup pour votre tuto.
J’ai une petite question :
Su la page d’accueil d’un site j’ai la liste de mes articles (titre, extrait du contenu, auteur, la date, la catégorie).
Un article peut être dans plusieurs catégorie et sous catégorie.
Pour afficher la catégorie , j’ai mis actuellement le code ci-dessous :
cat_name; ?>
ca me prend donc on compte la première catégorie ou sous-catégorie (par ordre alphabétique). Or je voudrais afficher seulement la catégorie parent.
Avez-vous une solution ?
Merci
Bonjour,
Je suppose que vous avez fait une fausse manip en copiant/collant votre code.
Pris tout seul,
cat_name; ?>
ne peut en effet rien afficher d’autre qu’une erreur php.Partant du principe que vous faites une requête classique type
query_posts( 'cat=3' );
(3 correspondant à l’ID de votre catégorie mère), il vous suffit d’exclure de cette requête les catégories enfant que vous ne souhaitez pas afficher, ce qui donnerait quelque chose ressemblant à ceci :query_posts( 'cat=3,-12,-13' );
(12 et 13 correspondant dans cet exemple à deux catégories enfant de la catégorie 3, et le signe « – » servant de marqueur d’exclusion).Bonjour,
Merci pour votre réponse.
J’ai déjà testé le code que vous m’avez donné. il fonctionne mais ne peut s’adapter au site. Car je veux quelques chose d’automatique et pas ID par ID.
Il s’agit d’un site d’actualité sportive. Sur la page d’accueil j’ai l’ensemble des extraits de mes articles par date avec juste dessus un petit encart avec le nom de la catégorie. Mes articles sont dans plusieurs catégories. Je veux sur cet encart afficher seulement la catégorie parent.
Pour le moment j’ai mis ce code
$cat = get_the_category(); $cat = $cat[0]; echo $cat->cat_name;</code
Ca m'affiche en effet une seule catégorie mais ça prend la 1ère par ordre alphabétique (donc nom de la catégorie parent ou sous catégorie).
J'ai aussi essayer ce code :
foreach((get_the_category()) as $childcat) {
$parentcat = $childcat->category_parent;
if( $parentcat != 0 ) echo '' .get_cat_name($parentcat) .' » ';
}
Ca m'affiche la catégorie parent mais si cet article à plusieurs sous-catégorie ça m'affiche plusieurs fois le nom de la catégorie parent.
Voici l'adresse du site pour mieux comprendre pour info (theme enfant du theme twentysixteen) :
http://www.djfoot.com/
Merci encore
Dans votre cas, l’idée d’une boucle pour trouver la catégorie parent est pertinente. Il ne vous reste qu’à dé-doublonner vos résultats. Pour cela, il suffit de les stocker dans un tableau pendant votre boucle, puis de faire un array_unique() dessus.
Si vous êtes certain de n’avoir qu’une seule catégorie parent, c’est encore plus simple, il vous suffit de faire un break pour stopper votre boucle, ce qui donnerait le code suivant :
foreach((get_the_category()) as $childcat) {
$parentcat = $childcat->category_parent;
if( $parentcat != 0 ) {
echo '' .get_cat_name($parentcat) .' » ';
break;
}
}
Super ça marche.
Merci beaucoup pour votre réponse et votre réactivité.
Bonjour,
Je me permet de revenir vers vous.
Je viens de me rendre compte que votre code fonctionne très bien mais si un article a une catégorie parent mais aucune sous-catégorie, le nom de la catégorie parent ne s’affiche pas.
J’ai testé plusieurs codes mais sans succès. Si jamais vous aviez idée.
Merci encore pour votre aide
Bonjour,
Si un article ne se trouve pas dans une sous-catégorie, il vous faut simplement tester ce cas de figure à la fin de votre boucle.
En toute logique, dans ce cas de figure,
$parentcat
sera égal à 0.Cela donne donc quelque chose dans ce genre :
foreach((get_the_category()) as $childcat) {
$parentcat = $childcat->category_parent;
if( $parentcat != 0 ) {
echo '' .get_cat_name($parentcat) .' » ';
break;
}
}
// on teste le cas où il n'y a pas de parent
if($parentcat==0) {
echo '' .get_cat_name($childcat->term_id) .' » '; // on affiche le nom de la seule catégorie trouvée
}