Supprimer le slug des URL de publication de type de message personnalisé
-
-
Je suppose queje megratte latêtepour savoirpourquoitu voudraisfaire ça?Confus.I guess I'm scratching my head as to why you would want to do that? Confused.
- 0
- 2017-05-29
- Michael Ecklund
-
@MichaelEcklundparce quetout CPT utilisépour créer despages Webpubliques a unnom de slugforcé dans l'URL.Il y aen faitbeaucoup de développeurs wp qui cherchent à supprimer le slugen toute sécurité.@MichaelEcklund because any CPT that is used to create public facing web pages has a forced slug name in the URL. There is actually a lot of wp devs looking to remove the slug safely.
- 3
- 2017-07-18
- Ben Racicot
-
10 réponses
- votes
-
- 2015-09-30
Le code suivantfonctionnera,mais vous devezjustegarder à l'esprit que des conflitspeuvent survenirfacilement si le slug de votretype depublicationpersonnaliséest lemême que celui d'unepage ou d'unmessage ...
Tout d'abord,nous allons supprimer le slug dupermalien:
function na_remove_slug( $post_link, $post, $leavename ) { if ( 'events' != $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', 'na_remove_slug', 10, 3 );
Ilne suffitpas de supprimer la limace. Pour lemoment,vous obtiendrez unepage 404 car WordPress s'attend uniquement à ce que les articleset lespages se comportent de cettefaçon. Vous devrez également ajouter les éléments suivants:
function na_parse_request( $query ) { if ( ! $query->is_main_query() || 2 != count( $query->query ) || ! isset( $query->query['page'] ) ) { return; } if ( ! empty( $query->query['name'] ) ) { $query->set( 'post_type', array( 'post', 'events', 'page' ) ); } } add_action( 'pre_get_posts', 'na_parse_request' );
Remplacez simplement les "événements"par votretype demessagepersonnaliséet vous êtesprêt àpartir. Vous devrezpeut-être actualiser vospermaliens.
The following code will work, but you just have to keep in mind that conflicts can happen easily if the slug for your custom post type is the same as a page or post's slug...
First, we will remove the slug from the permalink:
function na_remove_slug( $post_link, $post, $leavename ) { if ( 'events' != $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', 'na_remove_slug', 10, 3 );
Just removing the slug isn't enough. Right now, you'll get a 404 page because WordPress only expects posts and pages to behave this way. You'll also need to add the following:
function na_parse_request( $query ) { if ( ! $query->is_main_query() || 2 != count( $query->query ) || ! isset( $query->query['page'] ) ) { return; } if ( ! empty( $query->query['name'] ) ) { $query->set( 'post_type', array( 'post', 'events', 'page' ) ); } } add_action( 'pre_get_posts', 'na_parse_request' );
Just change "events" to your custom post type and you're good to go. You may need to refresh your permalinks.
-
Merci.Pensez-vous que c'estmieux que de créer les réécrituresmanuellement?J'ai vu cette solutionet celapeuttenir les conflits que vousmentionnez à distance?thanks. Do you think this is better than creating the rewrites manually? I've seen that solution and it may keep the conflicts you mention at bay?
- 0
- 2015-10-01
- Ben Racicot
-
Jepense que c'est unebonne solution automatisée si vous êtes convaincu que vousne créerezpas de conflits.Cen'estpas unebonne solution si vousfournissez ceci à ... disons à un client quin'estpas avertien technologie.I think this is a good automated solution if you're confident that you won't be creating conflicts. This isn't a good solution if you're providing this to... let's say a client that isn't tech savvy.
- 0
- 2015-10-01
- Nate Allen
-
pouvez-vousmettre àjour,comment utiliser ce codepourplusieurstypes depublicationcan you please update, how to use this code for multiple post types
- 1
- 2016-01-25
- Abin
-
Il échoue avecnginx car la condition `2!=Count ($ query-> query)`.Avecnginx,vouspouvez avoir $ query-> query comme `array ('page'=> '','name'=> '...','q'=> '...')`.Alors @NateAllen,quelleest la signification de cette condition?It fails with nginx because the condition `2 != count( $query->query )`. With nginx, you can have $query->query as `array('page' => '', 'name' => '...', 'q' => '...')`. So @NateAllen, what is the meaning of that condition?
- 1
- 2016-11-08
- Fabio Montefuscolo
-
Nous avonsbesoin de quelque chose demieux que ça.Priseen charge de la suppression du slugintégré afin quenousne puissionspas créer d'URLen conflit ultérieurement.Lafaçon dont lespublicationset lespages régulières créent leurs URL.We need something better than this. Support to remove the slug built in so that we cannot create conflicting URLs later on. The way regular posts and pages create their URLs.
- 3
- 2017-07-18
- Ben Racicot
-
Est-cejustemoi ouest-ce que cela casse certainesbalises conditionnelles wordpress commeis_single ()et is_singular ()?Is it just me or does this break some wordpress conditional tags like is_single() and is_singular()?
- 4
- 2017-07-18
- rob-gordon
-
Cette solution amalheureusement causé des liens casséset monblog a cessé d'afficher des articleset n'était qu'unepagenormale.Voir unemeilleure solution ci-dessouspar Matt Keys.This solution unfortunately caused some broken links and my blog stopped showing posts and was just a normal page. See a better solution below by Matt Keys.
- 1
- 2018-10-08
- Radley Sustaire
-
Ce code suppose que lenom `post_type`est lemême que letype depublicationpersonnalisé` slug` quine doitpasnécessairement être danstous les cas.Maispour le reste,excellente solutionmême sije suis d'accord qu'une solution WPnative seraitmeilleure.This code assumes that the `post_type` name is the same as the custom post type `slug` which doesn't necessarily have to be in every case. But for the rest, great solution although I agree a native WP solution would be better.
- 0
- 2019-06-14
- Marco Miltenburg
-
single- {cpt} .php cesse defonctionneren utilisant cette approchesingle-{cpt}.php stops working using this approach
- 0
- 2020-01-05
- Saleh Mahmood
-
Pour ceux qui ont unproblème avec le code ci-dessus,celafonctionne comme un charme si vous remplacez la deuxièmefonction (**functionna_parse_request () **)par celletrouvée sur cette [réponse] (https://wordpress.stackexchange.com/a/292379/175093).N'oubliezpas demodifier le code avec votreproprenom detype depublicationpersonnalisé.For those who have a problem with the code above, it works like a charm if you replace the second function ( **function na_parse_request()** ) by the one found on this [answer](https://wordpress.stackexchange.com/a/292379/175093). Dont forget to modify the code with your own Custom Post Type name.
- 0
- 2020-04-03
- PhpDoe
-
J'utilise cejoli codejusqu'à l'arrivée de WP 5.2.Après lamise àjour,ce code commence à échouer surmonplugin Custom Post Typeet leplugin Advanced Custom Fields,carje pense qu'ils utilisent lamêmefonctionpre_get_posts,donc au lieu de Advanced Custom Field Groups,je voismes articlespersonnalisés dans ceplugin.Échec également avec leplugin CPT UI -ne peutplus créer denouveauxmessages,ilsn'apparaissentpas dans la liste après les avoir créés.Veuillez aider !!I have been using this nice code until WP 5.2 came. After the update this code starts to fail on my Custom Post Type plugin and Advanced Custom Fields plugin, because, I think, they are using the same pre_get_posts function, so instead of Advanced Custom Field Groups I see my custom posts in this plugin... Also fails with CPT UI plugin - can not create new posts anymore, they are not appearing in list after creating them. Please help!!
- 0
- 2020-05-04
- Gediminas
-
Cela afonctionnépour letype demessage unique.Comment utiliser le codepourplusieurstypes depublication?It worked for single post type. How to use the code for multiple post type?
- 0
- 2020-07-02
- Swaranan Singha Barman
-
- 2017-04-12
Écrivez le code suivant dans l'enregistrement detaxonomie.
'rewrite' => [ 'slug' => '/', 'with_front' => false ]
La chose laplusimportante àfaire après un changement de code
Unefois que vous avezmodifié votre document detaxonomie detype depublicationpersonnalisé,essayez d'accéder à Paramètres> Permaliens et réenregistrer vosparamètres ,sinon vous obtiendrez unepage 404nontrouvé.
Write following code into the taxonomy registration.
'rewrite' => [ 'slug' => '/', 'with_front' => false ]
Most important thing that you have to do after code changing
After you’ve altered your custom post type taxonomy document, try to go to Settings > Permalinks and re-save your settings, else you will get 404 page not found.
-
Celafonctionne réellement,je ne saispas commentpersonnen'a remarqué cela auparavant.Bien sûr,celapeutinterférer avec d'autrespages sielles ont lemême lienpermanent,mais sinon,c'est uneexcellente solution.This actually works, i don't know how no one noticed this before. Of course this can interfere with other pages if they have same permalink, but if not this is a great solution.
- 0
- 2017-07-31
- Aleksandar Đorđević
-
J'aiessayé ça.Il donne le résultat souhaitépourmes liens detype depublicationpersonnalisés.Cependant,il «attrape»tous les slugs detype depublication POST ou PAGEet essaie de les résoudreen tant qu'URLpourmontype depublicationpersonnalisé,puis 404.(ouij'aienregistré despermaliens).Tried this out. It gives the desired result for my custom post type links. However it 'catches' all POST or PAGE post type slugs and tries to resolve them as a URL for my custom post type, then 404s. (yes I've saved permalinks).
- 6
- 2017-10-05
- Matt Keys
-
Ilpeut y avoir lemême slug den'importe quellepageet type depublicationpersonnalisé,modifiez votre slug depage,puis vérifiez.There might be the same slug of any page and custom post type, change your page slug and then check..
- 0
- 2017-10-11
- Mayank Dudakiya
-
Celane marchepas.Donne 404même lorsque vous avezmis àjour lespermaliens.This doesn't work. Gives 404 even when you've updated permalinks.
- 5
- 2017-11-12
- Christine Cooper
-
@ChristineCooper Vous devez suivre cette étape Unefois que vous avezmodifié votre document detaxonomie detype depublicationpersonnalisé,essayez d'accéder à Paramètres> Permalienset réenregistrez vosparamètres,sinon vous obtiendrez unepage 404introuvable.@ChristineCooper You have to follow this step After you’ve altered your custom post type taxonomy document, try to go to Settings > Permalinks and re-save your settings, else you will get 404 page not found.
- 0
- 2017-11-15
- Mayank Dudakiya
-
Commeje l'ai souligné dansmon dernier commentaire,vous obtiendrez uneerreur 404même * après * avoirmis àjour lespermaliens.Veuillezessayer vous-même.As I highlighted in my last comment, you will get an 404 error even *after* you have updated permalinks. Please give it a try yourself.
- 0
- 2017-11-15
- Christine Cooper
-
Fonctionne comme un charme,en particulier lors de la lecture detout lemessage,y compris lapartie «réenregistrer vosparamètres».+1Works like a charm, especially when reading the whole message, including the "re-save your settings" part. +1
- 0
- 2018-01-25
- davewoodhall
-
Encore unefois,même après avoir réenregistré lesparamètres depermalien,lespublicationset lespagesne fonctionnentplus (404)Again, even after re-saving the permalink settings, posts and pages no longer work (404)
- 3
- 2018-02-13
- amklose
-
Cette solutionfonctionnepour supprimer le slug de l'URL.Mais lespages d'archivesne fonctionnentplus.This solution works for removing the slug from URL. But the archive pages don't work anymore.
- 1
- 2018-09-25
- Annapurna
-
Comme d'autres l'ontindiqué,celafonctionnepour lespostes du CPTeux-mêmes.Mais celaprovoquemaintenant un 404pour lespagesnormales.As others have stated, this does work for the CPT posts themselves. But it's causing a 404 for regular Pages now.
- 0
- 2019-07-03
- Garconis
-
- 2015-09-30
J'aiessayé de comprendre celailn'y apas longtempset la réponse courte d'après ce queje saisest non .Pas àpartir de l'argument de réécriture aumoins.
La longueexplication devient évidente si vous regardez le code réel de
register_post_type
dans wp-includes/post.php ligne 1454 :add_permastruct( $post_type, "{$args->rewrite['slug']}/%$post_type%", $permastruct_args );
Vouspouvez voir qu'ilpréfixe
$args->rewrite['slug']
à labalise de réécriture%$post_type%
.Onpourraitpenser "définissons simplement le slug surnull
puis"jusqu'à ce que vous regardiez quelques lignes:if ( empty( $args->rewrite['slug'] ) ) $args->rewrite['slug'] = $post_type;
Vouspouvez voir que lafonction toujours attend une valeur de slug quin'estpas videet utilise autrement letype depublication.
I tried to figure this out not long ago and the short answer from what I know is no. Not from within the rewrite argument at least.
The long explanation becomes apparent if you look at the actual code of
register_post_type
in wp-includes/post.php line 1454:add_permastruct( $post_type, "{$args->rewrite['slug']}/%$post_type%", $permastruct_args );
You can see it prefixes
$args->rewrite['slug']
to the%$post_type%
rewrite tag. One could think "let's just set the slug tonull
then" until you look a few lines up:if ( empty( $args->rewrite['slug'] ) ) $args->rewrite['slug'] = $post_type;
You can see that the function always expects a slug value that is not empty and otherwise uses the post type.
-
Merci @JanBeck.Y a-t-il une raisonmajeure à cela?Pourquoine paspirater cefichier debase avec une conditionpour omettre certainstypes depublication de cette règle?Thanks @JanBeck . Is there a major reason for this to exist? Why not hack this core file with a conditional to omit certain post types from this rule?
- 0
- 2015-09-30
- Ben Racicot
-
Vous devriez attribuer la réponse à Jan Beck.WordPress abesoin du slugpost_typepour acheminer correctement les demandes.Cette règleempêche les conflits de dénominationentre lespages WPnatives (qui s'affichent sans le slug)et lestypes depublication définispersonnalisés.Si vouspiratez le slug,WordPressne connaîtrapas la différenceentre unepagenommée "pique-nique"et un événement (type depublicationpersonnalisé)nommé "pique-nique".You should award the answer to Jan Beck. WordPress needs the post_type slug to route requests properly. This rule prevents naming conflicts between native WP pages (which render without the slug) and any custom defined post types. If you hack the slug out then WordPress won't know the difference between a page named "picnic" and an event (custom post type) named "picnic".
- 9
- 2015-09-30
- dswebsme
-
@dswebsme D'accord,maisil y a des situations où vous devez absolument changer l'URL.Donc,àpartpourquoi vousne pouvezpaset ne devriezpasnativement,commentfaites-vous siefficacement?@dswebsme Agreed, but there are situations where you absolutely must change the URL. So other than why you can't natively and shouldn't, how do you do so efficiently?
- 3
- 2015-10-01
- Ben Racicot
-
- 2015-10-02
En réponse à ma réponseprécédente : vouspouvezbien sûr définir leparamètre
rewrite
surfalse
lors de l'enregistrement d'unnouveautype depublicationet gérer vous-même les règles de réécriture<?php function wpsx203951_custom_init() { $post_type = 'event'; $args = (object) array( 'public' => true, 'label' => 'Events', 'rewrite' => false, // always set this to false 'has_archive' => true ); register_post_type( $post_type, $args ); // these are your actual rewrite arguments $args->rewrite = array( 'slug' => 'calendar' ); // everything what follows is from the register_post_type function if ( is_admin() || '' != get_option( 'permalink_structure' ) ) { if ( ! is_array( $args->rewrite ) ) $args->rewrite = array(); if ( empty( $args->rewrite['slug'] ) ) $args->rewrite['slug'] = $post_type; if ( ! isset( $args->rewrite['with_front'] ) ) $args->rewrite['with_front'] = true; if ( ! isset( $args->rewrite['pages'] ) ) $args->rewrite['pages'] = true; if ( ! isset( $args->rewrite['feeds'] ) || ! $args->has_archive ) $args->rewrite['feeds'] = (bool) $args->has_archive; if ( ! isset( $args->rewrite['ep_mask'] ) ) { if ( isset( $args->permalink_epmask ) ) $args->rewrite['ep_mask'] = $args->permalink_epmask; else $args->rewrite['ep_mask'] = EP_PERMALINK; } if ( $args->hierarchical ) add_rewrite_tag( "%$post_type%", '(.+?)', $args->query_var ? "{$args->query_var}=" : "post_type=$post_type&pagename=" ); else add_rewrite_tag( "%$post_type%", '([^/]+)', $args->query_var ? "{$args->query_var}=" : "post_type=$post_type&name=" ); if ( $args->has_archive ) { $archive_slug = $args->has_archive === true ? $args->rewrite['slug'] : $args->has_archive; if ( $args->rewrite['with_front'] ) $archive_slug = substr( $wp_rewrite->front, 1 ) . $archive_slug; else $archive_slug = $wp_rewrite->root . $archive_slug; add_rewrite_rule( "{$archive_slug}/?$", "index.php?post_type=$post_type", 'top' ); if ( $args->rewrite['feeds'] && $wp_rewrite->feeds ) { $feeds = '(' . trim( implode( '|', $wp_rewrite->feeds ) ) . ')'; add_rewrite_rule( "{$archive_slug}/feed/$feeds/?$", "index.php?post_type=$post_type" . '&feed=$matches[1]', 'top' ); add_rewrite_rule( "{$archive_slug}/$feeds/?$", "index.php?post_type=$post_type" . '&feed=$matches[1]', 'top' ); } if ( $args->rewrite['pages'] ) add_rewrite_rule( "{$archive_slug}/{$wp_rewrite->pagination_base}/([0-9]{1,})/?$", "index.php?post_type=$post_type" . '&paged=$matches[1]', 'top' ); } $permastruct_args = $args->rewrite; $permastruct_args['feed'] = $permastruct_args['feeds']; add_permastruct( $post_type, "%$post_type%", $permastruct_args ); } } add_action( 'init', 'wpsx203951_custom_init' );
Vouspouvez voir que l'appel
add_permastruct
n'inclutplus le slug. J'aitesté deux scénarios:- Lorsquej'ai créé unepage avec le slug «calendrier»,cettepageest écraséepar l'archive detype depublication qui utilise également le slug «calendrier».
- Lorsquej'ai créé unepage avec le slug "my-event"et un événement (CPT) avec le slug "my-event",letype depublicationpersonnaliséest affiché.
- Les autrespagesne fonctionnentpasnonplus. Si vous regardez l'image ci-dessus,vous comprendrezpourquoi: la règle detype depublicationpersonnalisée correspondratoujours à un slug depage. Parce que WordPressn'a aucunmoyen d'identifier s'il s'agit d'unepage ou d'untype depublicationpersonnalisé quin'existepas,il renverra 404. C'estpourquoi vous avezbesoin d'un slugpouridentifier lapage ou le CPT. Une solutionpossible serait d'intercepter l'erreuret de rechercher unepage quipourraitexister similaire à cette réponse .
In response to my previous answer: you could of course set the
rewrite
parameter tofalse
when registering a new post type and handle the rewrite rules yourself like so<?php function wpsx203951_custom_init() { $post_type = 'event'; $args = (object) array( 'public' => true, 'label' => 'Events', 'rewrite' => false, // always set this to false 'has_archive' => true ); register_post_type( $post_type, $args ); // these are your actual rewrite arguments $args->rewrite = array( 'slug' => 'calendar' ); // everything what follows is from the register_post_type function if ( is_admin() || '' != get_option( 'permalink_structure' ) ) { if ( ! is_array( $args->rewrite ) ) $args->rewrite = array(); if ( empty( $args->rewrite['slug'] ) ) $args->rewrite['slug'] = $post_type; if ( ! isset( $args->rewrite['with_front'] ) ) $args->rewrite['with_front'] = true; if ( ! isset( $args->rewrite['pages'] ) ) $args->rewrite['pages'] = true; if ( ! isset( $args->rewrite['feeds'] ) || ! $args->has_archive ) $args->rewrite['feeds'] = (bool) $args->has_archive; if ( ! isset( $args->rewrite['ep_mask'] ) ) { if ( isset( $args->permalink_epmask ) ) $args->rewrite['ep_mask'] = $args->permalink_epmask; else $args->rewrite['ep_mask'] = EP_PERMALINK; } if ( $args->hierarchical ) add_rewrite_tag( "%$post_type%", '(.+?)', $args->query_var ? "{$args->query_var}=" : "post_type=$post_type&pagename=" ); else add_rewrite_tag( "%$post_type%", '([^/]+)', $args->query_var ? "{$args->query_var}=" : "post_type=$post_type&name=" ); if ( $args->has_archive ) { $archive_slug = $args->has_archive === true ? $args->rewrite['slug'] : $args->has_archive; if ( $args->rewrite['with_front'] ) $archive_slug = substr( $wp_rewrite->front, 1 ) . $archive_slug; else $archive_slug = $wp_rewrite->root . $archive_slug; add_rewrite_rule( "{$archive_slug}/?$", "index.php?post_type=$post_type", 'top' ); if ( $args->rewrite['feeds'] && $wp_rewrite->feeds ) { $feeds = '(' . trim( implode( '|', $wp_rewrite->feeds ) ) . ')'; add_rewrite_rule( "{$archive_slug}/feed/$feeds/?$", "index.php?post_type=$post_type" . '&feed=$matches[1]', 'top' ); add_rewrite_rule( "{$archive_slug}/$feeds/?$", "index.php?post_type=$post_type" . '&feed=$matches[1]', 'top' ); } if ( $args->rewrite['pages'] ) add_rewrite_rule( "{$archive_slug}/{$wp_rewrite->pagination_base}/([0-9]{1,})/?$", "index.php?post_type=$post_type" . '&paged=$matches[1]', 'top' ); } $permastruct_args = $args->rewrite; $permastruct_args['feed'] = $permastruct_args['feeds']; add_permastruct( $post_type, "%$post_type%", $permastruct_args ); } } add_action( 'init', 'wpsx203951_custom_init' );
You can see the
add_permastruct
call now doesn't include the slug anymore. I tested two scenarios:- When I created a page with the slug "calendar" that page is overwritten by the post type archive which also uses the "calendar" slug.
- When I created a page with the slug "my-event" and an event (CPT) with the slug "my-event", the custom post type is displayed.
- Any other pages do not work either. If you look at the picture above it becomes clear why: the custom post type rule will always match against a page slug. Because WordPress has no way of identifying if it's a page or a custom post type that does not exist, it will return 404. That's why you need a slug to identify either the page or CPT. A possible solution would be to intercept the error and look for a page that might exist similar to this answer.
-
Donc,si l'objectifest de supprimer le slugpour les CPT,ne pourrions-nouspasnommer le CPT quelque chose d'unique quine se heurteraitpas carilne serajamais vu dans l'URL detoutefaçon?Ou lepost-nomest-il le conflitpossible s'ilestnommé de lamêmemanière qu'unepage?So if the goal is to remove the slug for CPT's couldn't we name the CPT something unique that wouldn't collide since it will never be seen in the URL anyways? Or is the post-name the possible conflict if named the same as a page?
- 0
- 2015-10-02
- Ben Racicot
-
J'aimis àjourma réponsepourmontrer que cela casse réellement *toutes * lespages.Sans slug,WP recherchera un CPT au lieu d'unepageet s'ilne letrouvepas,renvoie uneerreur.Donc,cen'esten faitpas lié aunom deposte.I have updated my answer to show that this does actually break *all* pages. Without a slug, WP will look for a CPT instead of a page and if it doesn't find it, return an error. So it's actually not related to the post-name.
- 0
- 2015-10-02
- Jan Beck
-
Je vois.Il devrait y avoir des règles de réécriture qui ajoutent «-1» auxfutures URLen conflit comme lespublications WPnativeset lespages.J'ai créé unticket Trac https://core.trac.wordpress.org/ticket/34136#ticket aimerait vospensées.I see. There should be rewrite rules that append '-1' to future conflicting URL's like native WP posts vs pages. I've created a trac ticket https://core.trac.wordpress.org/ticket/34136#ticket would love your thoughts.
- 1
- 2015-10-02
- Ben Racicot
-
- 2019-12-17
Tour d'horizon desplugins
Nous sommespresque 2020et bonnombre de ces réponsesne fonctionnentpas. Voicimonpropretour d'horizon des options actuelles:
-
La
- réponse Matt Keys semble être la seule sur labonne voie si vous voulez une solution de codepersonnalisée. Aucun desplugins quej'aitrouvésne peutfairetout ce quiest énuméréici,en particulier la vérification des doublons. Cette approche semble être unetrèsbonne opportunitépour unplugin si quelqu'un voulait lefaire.
- Permalink Manager Lite
- Lemeilleur despluginsgratuits quej'aiessayés.
- Donne un contrôletotal surtoute la structure complète des lienspermanents Page/Post/CPTet leurpermet d'être lesmêmes. L'interfacegraphiqueest de loin laplus richeen fonctionnalités.
- Permet également le remplacement completparpublicationet vouspermet de voir ce que serait l'original/par défautet de réinitialiser la valeurpar défaut sinécessaire.
- Prenden charge lemulti-site.
- Ne recherche pas les doublonsentre lestypes depublication,ce quiesttriste. Si unepageet un CPT ont lamême URL,lapage se chargeet le CPTestinaccessible. Aucun avertissementni erreur,il vous suffit defaire votrepropre vérificationmanuelle des doublons.
- Toutes lesfonctionnalités detaxonomie sont dans la version PRO. Lesproblèmes demise àniveau sont assez lourds.
- Permalienspersonnalisés
- La versiongratuitefaitbeaucoup. Lespermaliens detaxonomieet le supportpremium semblent être les seuls éléments retenuspour la versionpro.
- Vouspermet demodifier le lienpermanent complet pourtoutepage/publication/CPT.
- Prenden charge lemulti-site.
- Ne pas vouspermet demodifier la structurepar défaut afin que vostypes depublicationpersonnalisés soienttoujoursexample.com/cpt-slug/post-title,mais vouspouvez lesmodifierindividuellement.
- Ne recherche pas les doublonsentre lestypes demessages,ce quiesttriste.
- Permaliens detype demessagepersonnalisé
- Permet aux utilisateursnon-développeurs demodifier les éléments déjàfaciles àmodifier avec
register_post_type
- Ne pas vouspermet demodifier le slug debase CPT - uniquement lapartie qui vient après cela -tellementinutilepour les développeurset leproblème dans cette question.
- Permet aux utilisateursnon-développeurs demodifier les éléments déjàfaciles àmodifier avec
- supprimer le slug debase ... -mort depuisplusieurs annéesmaintenant ...ne pas utiliser.
Plugin Roundup
It's almost 2020 and a lot of these answers don't work. Here's my own roundup of the current options:
- Matt Keys answer seems to be the only one on the right track if you want a custom code solution. None of the plugins I found can do everything listed here, especially the duplicate checking. This approach seems like a really good opportunity for a plugin if anyone wanted to take that on.
- Permalink Manager Lite
- Best of the free plugins I tried.
- Gives full control over all Page/Post/CPT complete permalink structure and allows them to be the same. The GUI is by far the most feature-rich.
- Allows full override per-post as well and lets you see what the original/default would be and reset to the default if needed.
- Supports multi-site.
- Does not check for duplicates between post types, which is sad. If a page and a CPT have the same URL, the page loads and the CPT is inaccessible. No warnings or errors, you just have to do your own manual checking for duplicates.
- All taxonomy features are in the PRO version. The upgrade nags are pretty heavy.
- Custom Permalinks
- The free version does a lot. Taxonomy permalinks and premium support seem to be the only things withheld from the pro version.
- Allows you to change the full permalink for any individual page/post/CPT.
- Supports multi-site.
- Does not allow you to change the default structure so you your Custom Post Types will still be example.com/cpt-slug/post-title but you can change them individually.
- Does not check for duplicates between post types, which is sad.
- Custom Post Type Permalinks
- Allows non-developer users to change the things that are easy to change already with
register_post_type
- Does not allow you to change the CPT base slug - only the part that comes after that - so pretty much useless for developers and the issue in this question.
- Allows non-developer users to change the things that are easy to change already with
- remove base slug... - dead for several years now... do not use.
-
Leplugin Permalink Manager Liteest définitivement lameilleure solution: stable,robuste,propre,et la versiongratuite vouspermet de supprimer labase de limaces.Et celafonctionne aussi avec Polylang!Testé sur Wordpress 5.4,avec TwentyTwenty Theme,sans aucun autreplugin activé.Fonctionne comme un charme sur letype demessagepersonnalisé,peuimporte si vousen avez créé un hiérarchique (avec unposteenfantet unpostepetit-enfant).Detous ceux qui veulent une solutionpropre.The plugin Permalink Manager Lite is definitively the best solution : steady, robust, clean, and the free version allow you to remove the slug base. And it works with Polylang too ! Tested on Wordpress 5.4, with TwentyTwenty Theme, without any other plugin activated. Works like a charm on Custom Post Type, no matter if you have created a hierarchical one (with child post and grandchild post). From everyone who wants a clean solution.
- 1
- 2020-04-04
- PhpDoe
-
- 2017-02-25
Vousn'avezpasbesoin d'autant de codeen dur.Utilisez simplement unplugin léger:
Il a des optionspersonnalisables.
You dont need so much hard-code. Just use lightweight plugin:
It has customizable options.
-
Maintenant,je saispourquoi vous avez obtenu un votenégatif,celaempêche la résolution des liens depagenormaux.Jene l'aipas vuparce queje recevais des copiesen cache despagesexistantesmalgré l'actualisation.Now I know why you got downvoted, it prevents normal page links resolving. I didn't see it because I was getting cached copies of the existing pages despite refreshing.
- 0
- 2017-09-14
- Walf
-
@Walf Pouvez-vousme parler duproblèmeen détail?@Walf Can you tell me about the issue in details?
- 0
- 2017-09-14
- T.Todua
-
Suivre les liens vers despages (quin'étaientpas letype depublicationpersonnalisé) dumenuprincipal a donné 404erreurs,comme si lapagen'existaitpas;c'est ça.Following links to pages (that weren't the custom post type) from the main menu gave 404 errors, as if the page did not exist; that's it.
- 0
- 2017-09-14
- Walf
-
@Walfpouvez-vousme donner unexemple d'URL de votre occasion?(vouspouvez couvrir lenom de domaine si vous voulez,j'aijustebesoin d'unexemple d'ex)merci,je lemettrai àjour@Walf can you give me any example url of your occasion? (you can cover domain name if you want, i just need an ex example) thanks, i wil update it
- 0
- 2017-09-15
- T.Todua
-
"Ceplugin a étéfermé le 19 septembre 2018et n'estpas disponible autéléchargement. Cettefermetureest définitive.""This plugin has been closed as of September 19, 2018 and is not available for download. This closure is permanent."
- 1
- 2019-12-16
- squarecandy
-
- 2017-03-01
et nouspouvons apporter quelquesmodifications à lafonctionmentionnée ci-dessus:
function na_parse_request( $query ) { if ( ! $query->is_main_query() || 2 != count( $query->query ) || ! isset( $query->query['page'] ) ) { return; } if ( ! empty( $query->query['name'] ) ) { $query->set( 'post_type', array( 'post', 'events', 'page' ) ); } }
à:
function na_parse_request( $query ) { if ( ! $query->is_main_query() || 2 != count( $query->query ) || ! isset( $query->query['page'] ) ) { return; } if ( ! empty( $query->query['name'] ) ) { global $wpdb; $pt = $wpdb->get_var( "SELECT post_type FROM `{$wpdb->posts}` " . "WHERE post_name = '{$query->query['name']}'" ); $query->set( 'post_type', $pt ); } }
afin de définir labonne valeurpost_type.
and we can make some changes to above-mentioned function:
function na_parse_request( $query ) { if ( ! $query->is_main_query() || 2 != count( $query->query ) || ! isset( $query->query['page'] ) ) { return; } if ( ! empty( $query->query['name'] ) ) { $query->set( 'post_type', array( 'post', 'events', 'page' ) ); } }
to:
function na_parse_request( $query ) { if ( ! $query->is_main_query() || 2 != count( $query->query ) || ! isset( $query->query['page'] ) ) { return; } if ( ! empty( $query->query['name'] ) ) { global $wpdb; $pt = $wpdb->get_var( "SELECT post_type FROM `{$wpdb->posts}` " . "WHERE post_name = '{$query->query['name']}'" ); $query->set( 'post_type', $pt ); } }
in order to set right post_type value.
-
- 2017-05-03
Cela afonctionnépourmoi:
'rewrite' => array('slug' => '/')
This worked for me:
'rewrite' => array('slug' => '/')
-
Celane marchepas.Donne 404même lorsque vous avezmis àjour lespermaliens.This doesn't work. Gives 404 even when you've updated permalinks.
- 1
- 2017-11-12
- Christine Cooper
-
- 2017-05-29
Pourtous ceux qui lisent ceciet qui ont desproblèmes avec lespostsenfants commemoi,j'aitrouvé que lemeilleurmoyen était d'ajouter vospropres règles de réécriture.
Leprincipalproblème quej'avais était que WordPresstraite la redirection despages qui sont à 2niveaux (articlesenfants) deprofondeur unpeu différemment qu'iltraite 3niveaux deprofondeur (enfants d'articlesenfants).
Cela signifie que quandj'ai/post-type/post-name/post-child/je peux utiliser/post-name/post-childet celame redirigera vers celui avecpost-type devantmais sij'aipost-type/post-name/post-child/post-petit-enfant alorsje nepeuxpas utiliser depost-name/post-child/post-petit-child.
Enjetant un œil aux règles de réécriture,il semble que cela correspond à des choses autres que lenom depage auxpremieret deuxièmeniveaux (jepense que le deuxièmeniveau correspond à l'attachement),puisfait quelque chosepour vous rediriger vers lemessage approprié. Àtroisniveaux,celane fonctionnepas.
Lapremière chose àfaireest de supprimer également le lien detype depublication desenfants. Cette logique devrait seproduireici si vous regardez la réponse de Nate Allen ci-dessus:
$post_link = str_replace( '/' . $post->post_type . '/', '/', $post_link );
Moi-même,j'ai utilisé unmélange de différentes conditionspour vérifier si lemessage avait desenfantset ainsi de suite afin d'obtenir lebonpermalien. Cettepartien'estpastrop compliquéeet voustrouverez desexemples depersonnes qui lefont ailleurs.
Laprochaine étapeest cependant de savoir où les choses changentpar rapport à la réponse donnée. Au lieu d'ajouter des éléments à la requêteprincipale (quifonctionnaitpour les articlespersonnaliséset leursenfantsmaispas les autresenfants),j'ai ajouté une réécriture qui allait aubas des règles WordPress afin que si lenom depagene soitpas vérifiéet qu'il était sur lepoint defrapper un 404ilferait une dernière vérificationpour voir si unepage dans letype depublicationpersonnalisé avait lemêmenom sinonil rejetterait le 404.
Voici la règle de réécriture quej'ai utiliséeen supposant que «événement»est lenom de votre CPT
function rewrite_rules_for_removing_post_type_slug() { add_rewrite_rule( '(.?.+?)?(:/([0-9]+))?/?$', 'index.php?event=$matches[1]/$matches[2]&post_type=event', 'bottom' ); } add_action('init', 'rewrite_rules_for_removing_post_type_slug', 1, 1);
J'espère que cela aide quelqu'un d'autre,je n'ai rientrouvé d'autre qui ait à voir avec lesposts de l'enfant desenfantset la suppression du slug de ceux-ci.
For anyone reading this that had trouble with child posts like I did I found the best way was to add your own rewrite rules.
The main issue I was having was that WordPress treats the redirect from pages that are 2 levels (child posts) deep a little differently than it treats 3 levels deep (child of child posts).
That means when I have /post-type/post-name/post-child/ I can use /post-name/post-child and it will redirect me to the one with post-type in front but if I have post-type/post-name/post-child/post-grandchild then I can't use post-name/post-child/post-grandchild.
Taking a look into the rewrite rules it looks like it matches for things other than pagename at the first and second levels (I think the second level matches attachment) and then does something there to redirect you to the proper post. At three levels deep it doesn't work.
First thing you need to do is to remove the post type link from children as well. This logic should happen here if you look at Nate Allen's answer above:
$post_link = str_replace( '/' . $post->post_type . '/', '/', $post_link );
Myself I used a mix of different conditionals to check if the post had children and whatnot in order to get to the right permalink. This part isn't too tricky and you'll find examples of people doing it elsewhere.
The next step though is where things change from the given answer. Instead of adding things to the main query (which worked for custom posts and their children but not the further children) I added a rewrite that went to the bottom of the WordPress rules so that if pagename didn't check out and it was about to hit a 404 it would do one last check to see if a page within the custom post type had the same name otherwise it would throw out the 404.
Here is the rewrite rule I used assuming 'event' is the name of your CPT
function rewrite_rules_for_removing_post_type_slug() { add_rewrite_rule( '(.?.+?)?(:/([0-9]+))?/?$', 'index.php?event=$matches[1]/$matches[2]&post_type=event', 'bottom' ); } add_action('init', 'rewrite_rules_for_removing_post_type_slug', 1, 1);
Hope this helps someone else, I couldn't find anything else that had to do with child of child posts and removing the slug from those.
-
Il semble y avoir unefaute defrappe dans l'expression régulière.Entre '(:' un '?' Estnécessairepour l'utiliser comme sous-modèlenon capturant=> '(?:'. Letroisième? Semblemalplacé carilpermet unpremier sous-modèle vide. Il devrait êtrepositionnéentre (et:.Sans cettefaute defrappe,l'expression sera lamême que celle quipeut êtretrouvéepour letype demessageintégré 'page'.There seems to be a typo in the regex. Between '(:' a '?' is needed to use it as non-capturing subpattern => '(?:'. The third ? seems misplaced as it allows an empty first subpattern. Propably it should be positioned between ( and :. Without this typo the expression will be the same as the one which can be found for the build-in post type 'page'.
- 0
- 2019-10-28
- jot
-
- 2019-06-19
J'aieu lesmêmesproblèmesiciet ilne semble y avoir aucunmouvement sur le site wordpress.Dansma situationparticulière oùpour des articles deblog uniques,la structure/blog/%postname%/étaitnécessaire cette solution
https://kellenmace.com/remove-custom-post-type-slug-from-permalinks/
s'estterminépar une série de 404
Mais avec cettemerveilleuse approche,quin'utilisepas la structure depermalinkbackendpour leblog,celafonctionnefinalement comme du charme. https://www.bobz.co/add-blog-prefix-permalink-structure-blog-posts/
Mercibeaucoup.
Had the same problems here and there seems to be no movement on wordpress site. In my particular situation where for single blogposts the structure /blog/%postname%/ was needed this solution
https://kellenmace.com/remove-custom-post-type-slug-from-permalinks/
ended in a bunch of 404s
But together with this wonderful approach, which is not using the backend permalink strukture for the blogpost it finally works like charme. https://www.bobz.co/add-blog-prefix-permalink-structure-blog-posts/
Thanks a bunch.
-
Les réponses aux liens uniquement sont déconseillées.Si vous aveztrouvé dans cet article une réponse différente des autres réponses de lapage,veuillezmettre un résuméet unexemple de code dans votre réponse.Link-only answers are discouraged. If you found an answer in this article that is different from the other answers on the page, please put a summary and code example in your answer.
- 0
- 2019-12-16
- squarecandy
Il semble quetoutes les ressources Webbasées sur le sujet de la suppression d'un slug detype depublicationpersonnaliséie
sontmaintenant des solutionstrès obsolètesfaisant souvent référence à desinstallations antérieures à WP version 3.5. Leplus courantest de:
dans votrefonction register_post_type. Celane fonctionnepluset esttrompeur. Je demande donc à la communauté au 3etrimestre 2018 aubord de WordPress 5 ...
Quels sont lesmoyensmoderneset efficaces de supprimer le slug detype depublication de l'URL d'unmessage detype depublicationpersonnalisé àpartir de l'argument de réécriture ou ailleurs?
MISE À JOUR: Il semble y avoirplusieursfaçons deforcer cela àfonctionner avec regex. Plusprécisément,la réponse de Jan Beck si vous êtestoujours disposé à surveiller la création de contenupour vous assurer qu'aucunnom depage/publicationen conflitn'est créé ... Cependant,je suis convaincu qu'il s'agit d'unefaiblessemajeure dans WP core oùelle devrait êtregéréepournous . À lafois comme option/crochet lors de la création d'un CPT ou d'unensemble avancé d'optionspour lespermaliens. Veuillez soutenir leticket depiste.
Note debas depage: veuillez soutenir ceticket Tracen le regardant/en faisant lapromotion: https://core .trac.wordpress.org/ticket/34136 #ticket