Supprimer le slug parent dans l’URL d’un CPT (Créer un compte)

  • WordPress :5.5
  • Statut : non résolu
  • Ce sujet contient 6 réponses, 4 participants et a été mis à jour pour la dernière fois par j.webiva, le il y a 1 mois.
7 sujets de 1 à 7 (sur un total de 7)
  • Auteur
    Messages
  • #2360162
    Purweb
    Participant
    Padawan WordPress
    51 contributions

    Bonjour,

    Voici le code que j’insert dans mon functions.php pour supprimer le slug d’un CPT présent dans l’URL :

    /**
     * Remove the custom post type slug from URL
     */
    function wpc_remove_cpt_slug($post_link, $post, $leavename) {
    	if ('SLUG' != $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', 'SLUG', 'page'));
    	}
    }
    
    add_action('pre_get_posts', 'wpc_parse_request_trick');

    J’utilise cela depuis plusieurs années et cela fonctionne parfaitement pour le besoin en question.

    Je dois actuellement créer une relation parent / enfant avec un CPT tout en gardant des URL courte de la forme nomdedomaine.fr/titre-publication/

    J’utilise CPT UI pour créer mes CPT. J’ai sélectionner “vrai” dans Hiérarchique me permettant d’avoir des relations parent-enfant pour le CPT en question.

    Prenons une exemple avec une marque automobile comme parent et un modèle comme enfant.

    J’obtiens en URL pour le CPT enfant : nomdedomaine.fr/renault/megane/

    Or il me faut : nomdedomaine.fr/megane/

    N’étant pas du tout un développeur chevronné mais plutôt un maxi bidouilleur apprenti développeur forever, j’ai fais ma recherche et adapter le code suivant que j’ai inséré toujours dans le functions.php :

    /**
     * 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 : nomdedomaine.fr/megane/

    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 nomdedomaine.fr.

    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.

    Quelqu’un a t’il déjà réussi à supprimer correctement le slug parent dans l’URL d’un CPT ?

    #2360327
    momofr@free.fr
    Modérateur
    Maître WordPress
    4272 contributions

    Salut, consulte cet article sur Codepad, je viens de tester ça sur un site de dev et ça marche très bien.

    Attention à bien ajouter la fonction de réécriture dans le CPT (je fais mes CPT à la main dans le thème enfant) et à ré-enregsitrer les permaliens pour prendre en compte la nouvelle structure.

    #2360687
    Purweb
    Participant
    Padawan WordPress
    51 contributions

    @<span class=”bbp-author-name”>momofr@free.f</span><span class=”bbp-author-name”>r : Un grand grand merci à toi. J’ai fait différents tests. Pour le moment je n’ai pas rencontré de bug.</span>

    J’ai juste un léger soucis côté BO avec en affichage Permalien : https://nomdedomaine.fr/CPT-parent/CPT-enfant/

    Néanmoins lorsque je teste en front aucun soucis j’ai bien : https://nomdedomaine.fr/CPT-enfant/.

    J’ai en revanche mis les paramétrages suivants sur le CPT :

    Archivée : Faux

    Hiérarchique : Vrai

    Réécrire : Vrai

    Peux tu, s’il te plaît, me dire si toi aussi tu as dans ton BO l’affichage Permalien : https://nomdedomaine.fr/CPT-parent/CPT-enfant/ ?

    #2382717
    j.webiva
    Participant
    Initié WordPress
    5 contributions

    Salut,

    Je cherche a enlever le slug de mon CPT de ma structure de permalien avec le code donné par @Purweb. J’ai créer mon CPT avec le plugin Jet Engine, mais avec le code donné, j’arrive bien à enlever le CPT slug mais mes pages affiche une erreur 404 mtn. Est-ce que vous avez une idée ? Est-ce que c’est la config de mon CPT qui est faux ?

    Vous trouverez ci-joint ma config pour mon CPT et le code que j’ai mis dans mon fichier functions.php

    Merci bcp pour votre aide !

    Fichiers joints :
    Vous devez être connecté pour voir les fichiers joints.
    #2382764
    Flobogo
    Modérateur
    Maître WordPress
    17607 contributions

    Bonjour @j-webiva,

    j’arrive bien à enlever le CPT slug mais mes pages affiche une erreur 404 mtn. Est-ce que vous avez une idée ?

    Une idée toute simple : suite à votre modif, avez-vous ré-enregistré vos permaliens ?
    Parfois, les idées simples sont les meilleures. Mais si ce n’est pas ça (si vous l’avez déjà fait), alors je sèche.

    #2382781
    j.webiva
    Participant
    Initié WordPress
    5 contributions

    Malheureusement oui, je l’ai fait !

    #2383010
    j.webiva
    Participant
    Initié WordPress
    5 contributions

    J’ai installer le plugin “Remove CPT base”, ce qui a fait l’affaire…

    J’aurais préférer éviter l’ajout d’un plugin et de simplement avoir un bout de code à ajouter… Est-ce que vous avez une idée du code à mettre pour que ca fonctionne ?

    Merci !

7 sujets de 1 à 7 (sur un total de 7)
  • Vous devez être connecté pour répondre à ce sujet.