Supprimer le slug d’un type de contenu sous WordPress

Les Custom Post Types ou types de contenu personnalisé sont l'une des pièces maîtresses de WordPress.

Bien que les règles de réécriture autorisent le changement du slug par une chaîne de votre choix, il est impossible nativement de le retirer afin d’obtenir des URLs plus courtes… après des heures de tests, une technique existe et elle fonctionne. Avis aux référenceurs !

Cette astuce a été initialement proposée par WordPress VIP et reprise sur de nombreux sites anglo-saxons, le lien originel affichant une erreur 404 à présent. Pour autant, cette technique a bien fonctionné dans mon cas y compris avec le plugin multilingue WPML (en multi-domaine).

N.B : vous devez utiliser /%postname%/ comme structure de permaliens pour appliquer cette astuce.

function wpc_remove_cpt_slug($post_link, $post, $leavename) {
	if ('type_de_contenu' != $post->post_type || 'publish' != $post->post_status) {
		return $post_link;
	}
	$post_link = str_replace( '/' . $post->post_type . '/', '/', $post_link );
	return $post_link;
}

add_filter('post_type_link', 'wpc_remove_cpt_slug', 0, 3); 

function wpc_parse_request_trick($query) {
	if (! $query->is_main_query())
	return;

	if (2 != count($query->query) || ! isset($query->query['page'])) {
		return;
	}

	if (! empty( $query->query['name'])) {
		$query->set('post_type', array('post', 'type_de_contenu', 'page'));
	}
}

add_action('pre_get_posts', 'wpc_parse_request_trick'); 

Il vous faudra remplacer type_de_contenu par l’identifiant de votre type de contenu vous l’aurez deviné. Ce bout de code est à copier dans un fichier de fonctions globales ou directement dans le functions.php de votre thème.

En d’autres termes, ce bout de code pourra basculer l’intégralité de votre site WordPress en mode /%postname%/ en indiquant au système que votre custom post type doit être traité comme un article ou une page. C’est le réglage recommandé pour optimiser votre référencement et l’appliquer aux types de contenus est une méthode intéressante dans le sens où le slug n’est pas toujours modifiable (cas des thèmes premium) et néfaste pour votre optimisation SEO.

Méfiance toutefois : je ne dis pas que cette méthode fonctionnera pour tout le monde. Dans mon cas, aucun souci à noter malgré ce que cela implique concrètement. Si vous obtenez des erreurs 404, allez dans Réglages puis Permaliens et faites Mettre à jour pour actualiser le site.

Une seconde astuce du même genre consistera à supprimer le slug de base pour vos taxonomies personnalisées. Souvenez-vous, nous faisions déjà cela à l’époque où seules les catégories existaient… le temps passe !

Par Aurélien Denis

Consultant & Développeur WordPress / WooCommerce. Un site à créer, à maintenir ou à débuguer ? Contactez-moi.

Des tutoriels et des bons plans en exclusivité !
  • Ce champ n’est utilisé qu’à des fins de validation et devrait rester inchangé.
8 commentaires
  1. Mon coin de Bourgogne

    Bonjour,
    Astuce qui pourrait m’intéresser, mais pour des pages enfants.
    Je m’explique : utilisant WP comme un CMS, j’ai pas mal de pages de contenu, en parallèle de quelques articles de type “blog d’actu”. Mon thème (Air Balloon Lite) me permet de mettre en page d’accueil un slider qui renvoie vers mes pages, donc c’est parfait. Seul bémol : les pages en question (à mettre en slider) doivent obligatoirement être des pages-enfants de la page d’Accueil (statique). Du coup, les URL de mes pages sont du type : nom-du-site/accueil/nom-de-la-page. Et si je veux mettre une page enfant, elle devient petit-enfant de la page d’accueil, une vraie galère avec des URL à rallonge.
    D’où ma question : comment supprimer ce mot “accueil” de mes URL, sachant que c’est donc le slug de la page-parente ?
    Pensez-vous que votre astuce ci-dessus corresponde à mon besoin ? (vous dites que ça ne concerne pas les pages)

    1. Aurélien Denis auteur de l’article

      Malheureusement votre thème est mal conçu…

  2. mac

    Je rencontre le même problème avec un slug de post custom écrit en dur dans le code.
    Cependant au lieu de supprimer le slug existant je cherche à le remplacer automatiquement par le nom de la catégorie à laquelle appartient le custom post.
    Y a t’il un moyen en modifiant ce petit bout de code excellent pour faire ce type de remplacement?

    1. Aurélien Denis auteur de l’article

      Ce type de modification reste expérimentale et doit être mise en place avec d’énormes précautions. Je vous le déconseille si vous n’êtes pas à l’aise avec les réécritures d’URL.

      1. Macintroll

        Finalement l’utilisation de ce bout de code est amplement suffisant et rempli parfaitement mon besoin ! Merci d’avoir partagé et merci du conseil ! ^^

  3. Vincent

    Bonjour,

    Merci pour cette excellente astuce. J’avais déjà intégré ce code sur de précédents sites. C’est super ça fonctionne pleinement.

    Aujourd’hui mon problème concerne des CPT parent / enfant. J’aimerai avoir example.com/CPTenfant mais à la place j’ai example.com/CPTparent/CPTenfant. J’ai aussi testé avec les pages et j’ai le même problème avec example.com/pageparent/pageenfant au lieu de example.com/pageenfant

    Avez-vous une idée sur le sujet ?

  4. Vincent Lemonnier

    Merci pour cette réponse.

    Néanmoins je souhaiterais éviter l’ajout d’un nouveau plugin.

    J’ai testé l’ajout de ce code :

    /**
    * Remove the parent custom post type slug from URL
    */
    function df_custom_post_type_link( $post_link, $id = 0 ) {
    $post = get_post($id);
    if ( is_wp_error($post) || ‘SLUG’ != $post->post_type || empty($post->post_name) )
    return $post_link;
    return home_url(user_trailingslashit( “$post->post_name” ));
    }
    add_filter( ‘post_type_link’, ‘df_custom_post_type_link’ , 10, 2 );

    function df_custom_rewrite_rule() {
    add_rewrite_rule(‘(.*?)$’, ‘index.php?news=$matches[1]’, ‘top’);
    }
    add_action(‘init’, ‘df_custom_rewrite_rule’);

    Mes CPT enfants ont bien une URL correcte avec : example.com/pageenfant/

    Mais dès que je fais des modifs dans le Back-Office de type ajouter un contenu ou supprimer un contenu ou encore créer un nouveau menu, j’ai alors un grand bug incompréhensible du type toutes mes URL se mettent à avoir une redirection vers la homepage c’est à dire example.com

    Je tiens à préciser qu’il s’agît de vraiment de toutes mes URL dans leur intégralité, c’est à dire pas que les URL du CPT en question.

Laisser un commentaire