Rimuovi lo slug dagli URL dei post del tipo di post personalizzato
-
-
Immagino chemi stograttando latesta sulmotivoper cui vorrestifarlo?Confuso.I guess I'm scratching my head as to why you would want to do that? Confused.
- 0
- 2017-05-29
- Michael Ecklund
-
@MichaelEcklundperché qualsiasi CPT utilizzatoper crearepagine Web rivolte alpubblico ha unnome slugforzatonell'URL.In realtà ci sonomolti sviluppatori di wp che cercano di rimuovere lo slugin modo sicuro.@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 risposta
- voti
-
- 2015-09-30
Il codice seguentefunzionerà,ma devi solotenerepresente chei conflittipossono verificarsifacilmente se lo slugperiltuotipo dipostpersonalizzato è lo stesso di unapagina o di uno slug di unpost ...
Perprima cosa,rimuoveremo lo slug dalpermalink:
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 );
La semplice rimozione dello slugnon è sufficiente. In questomomento,otterrai unapagina 404perché WordPress si aspetta solo chei poste lepagine si comportinoin questomodo. Dovrai anche aggiungere quanto segue:
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' );
Cambia "eventi"neltuotipo dipostpersonalizzatoe sei aposto. Potrebbeesserenecessario aggiornarei permalink.
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.
-
Grazie.Pensi che siameglio che creare le riscritturemanualmente?Ho visto quella soluzionee potrebbetenere abadai conflitti di cuiparli?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
-
Penso che questa sia unabuona soluzione automatizzata se sei sicuro dinon creare conflitti.Questanon è unabuona soluzione se lo staifornendo a ... diciamo un cliente chenon èesperto ditecnologia.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
-
puoi aggiornare,come utilizzare questo codiceperpiùtipi dipostcan you please update, how to use this code for multiple post types
- 1
- 2016-01-25
- Abin
-
Non riesce connginxperché la condizione `2!=Count ($ query-> query)`.Connginx,puoi avere $ query-> query come `array ('page'=> '','name'=> '...','q'=> '...')`.Allora @NateAllen,qual èil significato di quella condizione?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
-
Abbiamobisogno di qualcosa dimeglio di questo.Supportoper rimuovere lo slugintegratoin modo danonpoter creare URLin conflittoin seguito.Ilmodoin cuii poste lepaginenormali creanoi propri 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
-
Sono soloio o questointerrompe alcunitag condizionali di wordpress comeis_single ()e 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
-
Questa soluzionepurtroppo ha causato alcuni collegamentiinterrottie ilmioblog ha smesso dimostrarei postedera solo unapaginanormale.Vedi una soluzionemigliore di seguito da 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
-
Questo codicepresuppone cheilnome `post_type` sia lo stesso deltipo di articolopersonalizzato` slug` chenon devenecessariamenteesserein ogni caso.Maperil resto,ottima soluzione anche se sono d'accordo che una soluzione WPnativa sarebbemigliore.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 smette difunzionare usando questo approcciosingle-{cpt}.php stops working using this approach
- 0
- 2020-01-05
- Saleh Mahmood
-
Per coloro che hanno unproblema conil codice sopra,funziona ameraviglia se si sostituisce la secondafunzione (**functionna_parse_request () **) con quellatrovatain questa [risposta] (https://wordpress.stackexchange.com/a/292379/175093).Non dimenticare dimodificareil codice coniltuonome deltipo di articolopersonalizzato.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
-
Ho usato questobel codicefino all'arrivo di WP 5.2.Dopo l'aggiornamento,questo codiceinizia afallire sulmioplug-in Custom Post Typee Advanced Custom Fields,perché,penso,stanno usando la stessafunzionepre_get_posts,quindiinvece di Advanced Custom Field Groups vedoi mieipostpersonalizzatiin questoplug-in.Inoltrefallisce conilplug-in CPT UI -non èpiùpossibile crearenuovipost,non vengono visualizzatinell'elenco dopo averli creati.Perfavore aiuto!!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
-
Hafunzionatoperiltipo dipost singolo.Come utilizzareil codiceperpiùposttype?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
Scriviil seguente codicenella registrazione dellatassonomia.
'rewrite' => [ 'slug' => '/', 'with_front' => false ]
La cosapiùimportante che devifare dopo aver cambiatoil codice
Dopo avermodificatoil documento ditassonomia deltipo dipostpersonalizzato,prova ad andare su Impostazioni> Permalink e salvanuovamente leimpostazioni ,altrimenti otterrai lapagina 404nontrovato.
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.
-
Funziona davvero,non so comenessuno l'abbianotatoprima.Ovviamente questopuòinterferire con altrepagine se hanno lo stessopermalink,main caso contrario questa è un'ottima soluzione.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ć
-
L'hoprovato.Fornisceil risultato desideratoperi miei link ditipo dipostpersonalizzato.Tuttavia "cattura"tuttigli slug deltipo dipost POST o PAGEe cerca di risolverli come URLperilmiotipo dipostpersonalizzato,quindi 404.(sì,ho salvatoi permalink).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
-
Potrebbeesserci lo stesso slug di qualsiasipaginae tipo dipostpersonalizzato,modificare lo slug dellapaginae quindi controllare ..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
-
Questononfunziona.Fornisce 404 anche quando hai aggiornatoi permalink.This doesn't work. Gives 404 even when you've updated permalinks.
- 5
- 2017-11-12
- Christine Cooper
-
@ChristineCooper Devi seguire questopassaggio Dopo avermodificatoil documento ditassonomia deltipo dipostpersonalizzato,prova ad andare su Impostazioni> Permalinke salvanuovamente letueimpostazioni,altrimenti otterrai lapagina 404nontrovata.@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
-
Come hoevidenziatonelmio ultimo commento,riceverai unerrore 404 anche * dopo * aver aggiornatoi permalink.Perfavore,provalotu stesso.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
-
Funziona ameraviglia,soprattutto durante la lettura dell'interomessaggio,inclusa laparte "salvanuovamente leimpostazioni".+1Works like a charm, especially when reading the whole message, including the "re-save your settings" part. +1
- 0
- 2018-01-25
- davewoodhall
-
Ancora una volta,anche dopo aver salvatonuovamente leimpostazioni delpermalink,i poste lepaginenonfunzionanopiù (404)Again, even after re-saving the permalink settings, posts and pages no longer work (404)
- 3
- 2018-02-13
- amklose
-
Questa soluzionefunzionaper rimuovere lo slug dall'URL.Ma lepagine dell'archiviononfunzionanopiù.This solution works for removing the slug from URL. But the archive pages don't work anymore.
- 1
- 2018-09-25
- Annapurna
-
Come altri hanno affermato,questofunzionaperi post stessi del CPT.Ma ora sta causando un 404per lepaginenormali.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
Hoprovato a capirlononmoltotempofae la rispostabreve da quello che so è no .Almenonon dall'interno dell'argomento di riscrittura.
La lunga spiegazione diventaevidente seguardiil codiceeffettivo di
register_post_type
in wp-includes/post.php riga 1454 :add_permastruct( $post_type, "{$args->rewrite['slug']}/%$post_type%", $permastruct_args );
Puoi vederlo comeprefisso
$args->rewrite['slug']
neltag di riscrittura%$post_type%
.Sipotrebbepensare "impostiamo lo slug sunull
poi"finchénonguardi alcune righe:if ( empty( $args->rewrite['slug'] ) ) $args->rewrite['slug'] = $post_type;
Puoi vedere che lafunzione sempre si aspetta un valore slug chenon è vuotoe altrimenti utilizzailtipo dipost.
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.
-
Grazie @JanBeck.C'è una ragioneprincipaleper cui questoesiste?Perchénon hackerare questofile core con un condizionaleper omettere determinatitipi dipost da questa regola?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
-
Dovresti dare la risposta a Jan Beck.WordPress habisogno dello slugpost_typeperinstradare correttamente le richieste.Questa regolaprevienei conflitti di denominazionetra lepagine WPnative (che vengono visualizzate senza lo slug)e qualsiasitipo dipost definitopersonalizzato.Se hackerate lo slug out,WordPressnon conoscerà la differenzatra unapagina chiamata "picnic"e unevento (tipo dipostpersonalizzato) chiamato "picnic".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'accordo,ma ci sono situazioniin cui devi assolutamente cambiare l'URL.Quindi,oltre almotivoper cuinonpuoie non dovrestiin modonativo,comepuoifarloin modo cosìefficiente?@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
In risposta alla mia rispostaprecedente : puoi ovviamenteimpostareilparametro
rewrite
sufalse
quando registri unnuovotipo di articoloe gestire le regole di riscritturain questomodo<?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' );
Puoi vedere che la chiamata
add_permastruct
oranonincludepiù lo slug. Hotestato due scenari:- Quando ho creato unapagina con lo slug "calendar" quellapagina viene sovrascritta dall'archivio deltipo dipost che utilizza anche lo slug "calendar".
- Quando ho creato unapagina con lo slug "my-event"e unevento (CPT) con lo slug "my-event",viene visualizzatoiltipo dipostpersonalizzato.
- Neanche le altrepaginefunzionano. Seguardi l'immagine sopra diventa chiaroilmotivo: la regola deltipo dipostpersonalizzato corrisponderà sempre a uno slug dipagina. Poiché WordPressnon hamodo diidentificare se sitratta di unapagina o di untipo di articolopersonalizzato chenonesiste,restituirà 404. Eccoperché ènecessario uno slugperidentificare lapagina o CPT. Unapossibile soluzione sarebbeintercettare l'erroree cercare unapagina chepotrebbeesistere simile a questa risposta .
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.
-
Quindi,se l'obiettivo è rimuovere lo slugperi CPT,nonpotremmonominareil CPT qualcosa di unico chenonentrerebbein collisionepoichénon verràmai vistonell'URL comunque?O èilpost-nameilpossibile conflitto se denominato come unapagina?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
-
Ho aggiornato lamia rispostapermostrare che questoeffettivamenteinterrompe *tutte * lepagine.Senza uno slug,WP cercherà un CPTinvece di unapaginae senon lotrova,restituirà unerrore.Quindiin realtànon è correlato alnome delpost.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
-
Vedo.Dovrebberoesserci regole di riscrittura che aggiungono "-1" aifuturi URLin conflitto comei poste lepaginenativi di WP.Ho creato unbiglietto Trac https://core.trac.wordpress.org/ticket/34136#ticketmi piacerebbei tuoipensieri.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
Raccolta diplug-in
È quasiil 2020e molte di queste rispostenonfunzionano. Ecco lamia carrellata delle opzioni attuali:
-
La
- risposta di Matt Keys sembraessere l'unica sulla stradagiusta se vuoi una soluzione di codicepersonalizzato. Nessuno deiplugin che hotrovatopuòfaretutto ciò che èelencato qui,in particolareil controllo dei duplicati. Questo approccio sembra davvero unabuona opportunitàper unplug-in se qualcuno lo desiderava.
- Permalink Manager Lite
- Ilmeglio deiplugingratuiti che hoprovato.
- Offreil controllo completo sututta la struttura completa deipermalink Pagina/Post/CPTe consente loro diessere uguali. La GUI è digran lunga lapiù ricca difunzionalità.
- Consente anche l'override completoperposte ti consente di vedere quale sarebbe l'originale/predefinitoe di ripristinareil valorepredefinito senecessario.
- Supportamultisito.
- Non verifica lapresenza di duplicatitrai tipi dipost,il che ètriste. Se unapaginae un CPT hanno lo stesso URL,lapagina viene caricatae il CPT èinaccessibile. Nessun avviso oerrore,devi solofareiltuo controllomanualeperi duplicati.
- Tutte lefunzionalità dellatassonomia sononella versione PRO. Ifastidiosi aggiornamenti sonopiuttostopesanti.
- Permalinkpersonalizzati
- La versionegratuitafamolto. Ipermalink ditassonomiae il supportopremium sembranoessere le uniche cosenascoste dalla versionepro.
- Ti consente dimodificareilpermalink completo per ogni singolapagina/articolo/CPT.
- Supportamultisito.
- Non ti consente dimodificare la strutturapredefinita,quindii tuoitipi dipostpersonalizzati saranno ancoraexample.com/cpt-slug/post-titlemapuoimodificarli singolarmente.
- Non verifica lapresenza di duplicatitrai tipi dipost,il che ètriste.
- Permalink ditipopostpersonalizzato
- Consente agli utentinon sviluppatori dimodificare le cose che sonogiàfacili da cambiare con
register_post_type
- Non ti consente dimodificare lo slug dibase CPT,solo laparte che viene dopo,quindipraticamenteinutilepergli sviluppatorie ilproblemain questa domanda.
- Consente agli utentinon sviluppatori dimodificare le cose che sonogiàfacili da cambiare con
- rimuovi lo slug dibase ... -morto da diversi anni ormai ...non usare.
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.
-
Ilplugin Permalink Manager Lite è sicuramente la soluzionemigliore: stabile,robusto,pulitoe la versionegratuitati permette di rimuovere labase dello slug.Efunziona anche con Polylang!Testato su Wordpress 5.4,contema TwentyTwenty,senzanessun altroplugin attivato.Funziona come unincantesimo su Custom Post Type,nonimporta sene hai creato unogerarchico (conpostfiglioe postnipote).Datutti coloro che desiderano una soluzionepulita.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
Non haibisogno di cosìtanto hard-code.Usa solo unplugin leggero:
Ha opzionipersonalizzabili.
You dont need so much hard-code. Just use lightweight plugin:
It has customizable options.
-
Ora soperché sei stato svalutato,impedisce la risoluzione deinormali collegamenti allepagine.Non l'ho vistoperché stavo ricevendo copie cache dellepagineesistentinonostante l'aggiornamento.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 Puoiparlarmi delproblemanei dettagli?@Walf Can you tell me about the issue in details?
- 0
- 2017-09-14
- T.Todua
-
Seguendoi collegamenti allepagine (chenoneranoiltipo dipostpersonalizzato) dalmenuprincipale davanoerrori 404,come se lapaginanonesistesse;questo ètutto.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
-
@Walfpuoi darmi qualcheesempio di URL dellatua occasione?(puoi coprireilnome di dominio se vuoi,ho solobisogno di unexesempio)grazie,lo aggiornerò@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
-
"Questoplugin è stato chiusoil 19 settembre 2018e non è disponibileperil download. Questa chiusura è definitiva.""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
e possiamo apportare alcunemodifiche allafunzione sopramenzionata:
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' ) ); } }
a:
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 ); } }
perimpostareil valorepost_type corretto.
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
Questo hafunzionatoperme:
'rewrite' => array('slug' => '/')
This worked for me:
'rewrite' => array('slug' => '/')
-
Questononfunziona.Fornisce 404 anche quando hai aggiornatoi permalink.This doesn't work. Gives 404 even when you've updated permalinks.
- 1
- 2017-11-12
- Christine Cooper
-
- 2017-05-29
Per chiunque leggesse questo articoloe avesseproblemi coni post deibambini come hofattoio,ho scoperto cheilmodomiglioreera aggiungere letue regole di riscrittura.
Ilproblemaprincipale che stavo riscontrandoera che WordPresstrattail reindirizzamento dapagine che sonoprofonde di 2 livelli (post secondari)in modo leggermente diverso rispetto a quantotratta 3 livelliprofondi (post secondari).
Ciò significa che quando ho/post-type/post-name/post-child/posso usare/post-name/post-childe mi reindirizzerà a quello conpost-type davantima se hopost-type/post-name/post-child/post-grandchild alloranonposso usarepost-name/post-child/post-grandchild.
Dando uno sguardo alle regole di riscrittura sembra che corrisponda a cose diverse dalnome dellapagina alprimoe al secondo livello (penso cheil secondo livello corrisponda all'allegato)e poifa qualcosaper reindirizzarti alpost corretto. Atre livelli diprofonditànonfunziona.
Laprima cosa che devifare è rimuovereil collegamento deltipo dipost anche daibambini. Questa logica dovrebbe accadere qui seguardi la risposta di Nate Allen sopra:
$post_link = str_replace( '/' . $post->post_type . '/', '/', $post_link );
Io stesso ho usato unmix di diversi condizionaliper verificare seilpost avevafiglie quant'altroper ottenereilpermalink corretto. Questapartenon ètroppo complicatae troveraiesempi dipersone che lofanno altrove.
Tuttavia,ilpassaggio successivo è dove le cose cambiano rispetto alla risposta data. Invece di aggiungereelementi alla queryprincipale (che hafunzionatoperi postpersonalizzatie i lorofiglimanongli altrifigli) ho aggiunto una riscrittura che andavain fondo alle regole di WordPressin modo che seilnome dellapaginanonfosse andato abuonfine e stavaperfarlopremendo un 404farebbe un ultimo controlloper vedere se unapagina all'interno deltipo dipostpersonalizzato avesse lo stessonome,altrimentieliminerebbeil 404.
Ecco la regola di riscrittura che ho usato supponendo che "evento" siailnome deltuo 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);
Spero che questo aiuti qualcun altro,non sono riuscito atrovarenient'altro che avesse a chefare coni post di child of childe la rimozione dello slug da quelli.
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.
-
Sembra che ci sia unerrore dibattituranella regex.Tra '(:' a '?' Ènecessarioper usarlo comemodello secondarionon di cattura=> '(?:'. Ilterzo? Sembrafuoripostoin quanto consente unprimo sottomodello vuoto. Probabilmente dovrebbeessereposizionatotra (e:.Senza questoerrore dibattitura l'espressione sarà la stessa di quella chepuòesseretrovataperiltipo di articoloincorporato "pagina".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
Ho avutogli stessiproblemi quae làe sembra chenon ci sia alcunmovimento sul sito wordpress.Nellamia situazioneparticolarein cuiper singolipost delblog la struttura/blog/%postname%/eranecessaria questa soluzione
https://kellenmace.com/remove-custom-post-type-slug-from-permalinks/
èterminato con unmucchio di 404
Mainsieme a questomeraviglioso approccio,chenon utilizza la struttura dipermalinkbackendperilpost delblog,funzionafinalmente come unfascino. https://www.bobz.co/add-blog-prefisso-permalink-struttura-post-blog/
Graziemille.
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.
-
Le risposte di solo collegamento sono scoraggiate.Se haitrovato una rispostain questo articolo diversa dalle altre risposte sullapagina,inserisci un riepilogoe unesempio di codicenellatua risposta.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
Sembra chetutte le risorse web sibasino sull'argomento della rimozione di uno slug ditipopostpersonalizzato,adesempio
ora sono soluzionimolto obsolete che spessofanno riferimento ainstallazioniprecedenti alla versione 3.5 di WP. Uno comune è:
all'interno dellatuafunzione register_post_type. Questononfunzionapiùed èfuorviante. Quindi chiedo alla comunitànelterzotrimestre del 2018 sull'orlo di WordPress 5 ...
Quali sonoi modimoderniedefficientiper rimuovere lo slug deltipo dipost dall'URL di unpost ditipo dipostpersonalizzato dall'argomento di riscrittura o da qualsiasi altraparte?
AGGIORNAMENTO: Sembra che ci siano diversimodiperforzare questo a lavorare con regex. Inparticolare,la risposta di Jan Beck dovrebbeessere costantemente disposto amonitorare la creazione di contenutipergarantire chenon vengano creatinomi dipagine/postin conflitto ... Tuttavia sono convinto che questa sia una delleprincipali debolezzenel core di WP,dove dovrebbeesseregestitapernoi . Sia come opzione/gancio durante la creazione di un CPT o come set avanzato di opzioniperi permalink. Siprega di supportareilticket ditraccia.
Nota apiè dipagina: siprega di supportare questoticket Tracguardandolo/promuovendolo: https://core .trac.wordpress.org/ticket/34136 #ticket