Définir une URL d’archive d’un Custom Post Type

Un type de contenu personnalisé ou custom post type autorise la réécriture d’URL afin d’internationaliser mais surtout de personnaliser vos slugs à des fins SEO. 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 !

Crédits photo : kulturarvsprojektet

3 commentaires

  1. Julio Potier

    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 »

  2. eddy796Ed

    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;
    }

Laisser un commentaire