Mais saviez-vous que l’URL de la page d’archive pouvait faire l’objet, elle aussi, d’une réécriture ?
Il arrive parfois que certaines fonctions pourtant utilisées au quotidien nous révèlent encore des secrets. C’est le cas de la fonction register_post_type
qui permet de générer des types de contenus.
Celle-ci dispose d’un argument intitulé has_archive
et qui est défini sur true
si vous souhaitez regrouper vos contenus sur une page d’archive.
Exemple : vous créez un CPT ‘Propriétés’ dans le cadre d’un projet immobilier. Vos URLs pour chaque fiche auront cette forme : http://votresite.fr/propriete/villa-cote-basque/
Votre page d’archive sera donc de la forme : http://votresite.fr/propriete/
Et bien que diriez de définir un slug personnalisé pour cette fameuse page d’archive ? Les référenceurs pestent souvent contre ce slug imposé et que les développeurs contournent en créant un modèle de page utilisant la lourde WP_Query alors même que archive-CPT.php est le fichier que nous devrions utiliser en accord avec la hiérarchie des modèles de WordPress.
La solution est simple : l’argument has_archive
accepte une chaîne… autrement dit, vous pouvez saisir la valeur de votre choix et WordPress l’utilisera comme slug.
Ainsi, libre à vous d’obtenir ceci : http://votresite.fr/bien-immobiliers/ au lieu de http://votresite.fr/propriete/
Pas mal non ? Certainement une de ces astuces découvertes par hasard un dimanche après-midi d’hiver et qui mérite le détour !
Hello
C’est effectivement simple et bien mieux de faire ça afin d’utiliser le templating de WordPress.
Cependant attention, cette astuce n’est valable que si vous souhaitez avoir une URL des archives différente de celle de votre posts, exemple :
CPT "car", aucun param :
site.fr/car/ -> archives
site.fr/car/partner/ -> une voiture (single)
CPT "car", has_archive "archive":
site.fr/archive/ -> archives
site.fr/archive/partner/ -> une voiture (single)
CPT "car", rewrite slug "rewrite" :
site.fr/rewrite/ -> archives
site.fr/rewrite/partner/ -> une voiture (single)
CPT "car", rewrite slug "rewrite" + has_archive "archive" :
site.fr/archive/ -> archives
site.fr/rewrite/partner/ -> une voiture (single)
Sinon les règles de rewrite le font tout aussi bien :
$rewrite = array(
'slug' => 'rewrite', // sans ce slug, prends le slug du CPT par défaut sinon la valeur de has_archive si n'est pas "true"
'with_front' => true,
'pages' => true,
'feeds' => true,
);
Lire http://codex.wordpress.org/Function_Reference/register_post_type à “has_archive” et “rewrite” 😉
Hey merci de rappeler les règles de réécriture pour les single-CPT. J’espère que cela sera plus clair pour ceux qui nous lisent ! 😉
Et on peut même mettre une variable que l’on remplace par la suite :
$rewrite = array(
'slug' => '%myvar%',
...
add_filter( 'post_type_link', 'postTypeLink', 10, 2);
function postTypeLink($link, $post)
{
if (get_post_type($post) == 'example') {
$replace = what you want;
$link = str_replace('%myvar%/', $replace, $link);
}
return $link;
}
Bonjour,
J’aimerai changer archive-CTP.php par category-CTP.php pour utiliser l’index de CTP (http://votresite.fr/CTP/) comme page de catégorie. Je suppose que c’est au niveau du register_post_type que je dois faire le changement, mais je ne vois pas comment malgré le codex https://codex.wordpress.org/Function_Reference/register_post_type
Non pas du tout, il faut respecter la hiérarchie de templates de WordPress. Si l’idée est d’utiliser le même gabarit de l’archive du type de contenu pour une taxonomie (comme les catégories), alors il faut nommer le fichier category.php ou taxonomy.php.
Bonjour,
J’ai besoin d’aide pour mon site (www.i-formations.ch) dans lequel j’ai intégré un custom Post Type pour ma rubrique Formation. J’ai réussi à pas mal avancer, mais je peine à résoudre le problème lorsqu’on clique sur la catégorie (Système d’exploitation) et il affiche toujours la page par défaut archive.php alors que j’aimerai qu’il affiche la page archive-formation.php. Comment faire ?
Bonjour, il faut vérifier dans la déclaration du CPT que le slug est bien
formation
.bonjour,
ici
CPT “car”, rewrite slug “rewrite” + has_archive “archive” :
site.fr/archive/ -> archives
site.fr/rewrite/partner/ -> une voiture (single)
on a aussi
site.fr/archive/partner/ -> site.fr/rewrite/partner/ -> une voiture (single)