Eliminar slug de las URL de publicación de tipo de publicación personalizada
-
-
Supongo queme estoy rascando la cabezaen cuanto apor qué querrías hacereso.Confuso.I guess I'm scratching my head as to why you would want to do that? Confused.
- 0
- 2017-05-29
- Michael Ecklund
-
@MichaelEcklundporque cualquier CPT que se utilicepara crearpáginas webpúblicastiene unnombre de slugforzadoen la URL.En realidad,haymuchos desarrolladores de wp quebuscaneliminarel slug deforma segura.@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 respuestas
- votos
-
- 2015-09-30
El siguiente códigofuncionará,pero solo debeteneren cuenta que los conflictospueden ocurrirfácilmente siel slugpara sutipo depublicaciónpersonalizadaeselmismo queel de unapágina opublicación ...
Primero,eliminaremos lababosa delenlacepermanente:
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 );
Solo quitar lababosanoes suficiente. Enestemomento,obtendrá unapágina 404porque WordPress soloespera que laspublicaciones y laspáginas se comporten deestamanera. También deberá agregar lo siguiente:
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' );
Simplemente cambie "eventos" a sutipo depublicaciónpersonalizada yestará listo. Esposible que deba actualizar susenlacespermanentes.
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.
-
Gracias.¿Crees queestoesmejor que crear las reescriturasmanualmente?¿He vistoesa solución ypuedemantener a raya los conflictos quemenciona?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
-
Creo queestaes unabuena solución automatizada siestá seguro de queno creará conflictos.Estanoes unabuena solución si se loproporciona a ... digamos un cliente quenoesexpertoen tecnología.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
-
¿Puede actualizar,cómo usareste códigoparamúltiplestipos depublicaciones?can you please update, how to use this code for multiple post types
- 1
- 2016-01-25
- Abin
-
Falla connginxporque la condición `2!=Count ($ query-> query)`.Connginx,puedetener $ query-> query como `array ('page'=> '','name'=> '...','q'=> '...')`.Entonces @NateAllen,¿cuálesel significado deesa condición?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
-
Necesitamos algomejor queesto.Soporteparaeliminarel slugincorporadopara quenopodamos crear URL conflictivasmás adelante.Laformaen que laspublicaciones y laspáginasnormales crean sus 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
-
¿Soy solo yo oesto rompe algunasetiquetas condicionales de wordpress comois_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
-
Desafortunadamente,esta solución causó algunosenlaces rotos ymi blog dejó demostrarpublicaciones yera solo unapáginanormal.Vea unamejor solución a continuaciónpor 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
-
Este código asume queelnombre de `post_type`eselmismo queel deltipo depublicaciónpersonalizada` slug`,quenonecesariamentetiene que serloen todos los casos.Peropor lo demás,es unagran solución,aunqueestoy de acuerdoen que una solución WPnativa seríamejor.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 deja defuncionar usandoesteenfoquesingle-{cpt}.php stops working using this approach
- 0
- 2020-01-05
- Saleh Mahmood
-
Para aquellos quetienen unproblema conel código anterior,funciona como unencanto si reemplaza la segundafunción (**funciónna_parse_request () **)por la que seencuentraen esta [respuesta] (https://wordpress.stackexchange.com/a/292379/175093).No olvidemodificarel código con supropionombre detipo depublicaciónpersonalizada.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
-
Heestado usandoestebuen código hasta que llegó WP 5.2.Después de la actualización,este código comienza afallaren mi complemento Tipo depublicaciónpersonalizada yen el complemento Campospersonalizados avanzados,porque,creo,están usando lamismafunciónpre_get_posts,por lo queen lugar de Grupos de campospersonalizados avanzados veomispublicacionespersonalizadasen este complemento.Tambiénfalla conel complemento CPT UI: yano sepueden crearnuevaspublicaciones,yano aparecenen la lista después de crearlas.¡¡Porfavor ayuda!!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
-
Funcionóparaeltipo depublicación única.¿Cómo usarel códigopara variostipos depublicaciones?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
Escribael siguiente códigoen el registro detaxonomía.
'rewrite' => [ 'slug' => '/', 'with_front' => false ]
Lomásimportante que debe hacer después de cambiarel código
Una vez que hayasmodificadotu documento detaxonomía detipo depublicaciónpersonalizado,intentair a Configuración> Enlacespermanentes y vuelve aguardartu configuración ; de lo contrario,obtendrás lapágina 404noencontrado.
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.
-
Esto realmentefunciona,no sé cómonadie lonotó antes.Por supuesto,estopuedeinterferir con otraspáginas sitienen elmismoenlacepermanente,pero sino,estaes unagran solución.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ć
-
Probéesto.Dael resultado deseadoparamisenlaces detipo depublicaciónpersonalizada.Sinembargo,'captura'todas lasbabosas detipo depublicación POST o PAGEe intenta resolverlas como una URLparami tipo depublicaciónpersonalizada,luego 404s.(sí,heguardadoenlacespermanentes).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
-
Puede haberelmismo slug de cualquierpágina ytipo depublicaciónpersonalizada,cambieel slug de supágina y luego verifique ...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
-
Estonofunciona.Da 404incluso cuando ha actualizado losenlacespermanentes.This doesn't work. Gives 404 even when you've updated permalinks.
- 5
- 2017-11-12
- Christine Cooper
-
@ChristineCooper Tienes que seguirestepaso Después de habermodificado su documento detaxonomía detipo depublicaciónpersonalizada,intente ir a Configuración> Enlacespermanentes y vuelva aguardar su configuración; de lo contrario,obtendrá lapágina 404noencontrada.@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
-
Como destaquéen mi último comentario,obtendrás unerror 404incluso * después * de que hayas actualizado losenlacespermanentes.Pruébelo ustedmismo.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
-
Funciona a lasmilmaravillas,especialmente al leertodoelmensaje,incluida laparte de "volver aguardar la configuración".+1Works like a charm, especially when reading the whole message, including the "re-save your settings" part. +1
- 0
- 2018-01-25
- davewoodhall
-
Nuevamente,incluso después de volver aguardar la configuración delenlacepermanente,laspublicaciones y laspáginas yanofuncionan (404)Again, even after re-saving the permalink settings, posts and pages no longer work (404)
- 3
- 2018-02-13
- amklose
-
Esta soluciónfuncionaparaeliminarel slug de la URL.Pero laspáginas de archivo yanofuncionan.This solution works for removing the slug from URL. But the archive pages don't work anymore.
- 1
- 2018-09-25
- Annapurna
-
Como han dicho otros,estofuncionapara lospropiospuestos del CPT.Pero ahoraestáprovocando un 404parapáginasnormales.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
Traté de resolverestono hacemucho y la respuesta corta de lo que sées no .No desde dentro del argumento de reescritura almenos.
La largaexplicación se haceevidente si observael código real de
register_post_type
en wp-includes/post.php línea 1454 :add_permastruct( $post_type, "{$args->rewrite['slug']}/%$post_type%", $permastruct_args );
Puede ver quetiene elprefijo
$args->rewrite['slug']
en laetiqueta de reescritura%$post_type%
.Unopodríapensar "establezcamosel slugennull
luego" hasta quemires algunas líneas hacia arriba:if ( empty( $args->rewrite['slug'] ) ) $args->rewrite['slug'] = $post_type;
Puede ver que lafunción siempre espera un valor slug quenoestá vacío y,de lo contrario,usaeltipo depublicación.
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.
-
Gracias @JanBeck.¿Existe una razónimportantepara queestoexista?¿Por quénopirateareste archivoprincipal con un condicionalpara omitir ciertostipos depublicaciones deesta regla?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
-
Deberías darle la respuesta a Jan Beck.WordPressnecesitael slugpost_typeparaenrutar las solicitudes correctamente.Esta reglaevita los conflictos denombresentre laspáginasnativas de WP (que seprocesan sinel slug) y cualquiertipo depublicaciónpersonalizado definido.Sipiratea lababosa,WordPressno reconocerá la diferenciaentre unapágina llamada "picnic" y unevento (tipo depublicaciónpersonalizada) llamado "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 De acuerdo,pero hay situacionesen las quees absolutamentenecesario cambiar la URL.Entonces,aparte depor quénopuede deformanativa yno debe,¿cómo lo hace demaneraeficiente?@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 respuesta a mi respuesta anterior : por supuesto,puedeestablecerelparámetro
rewrite
enfalse
cuando registre unnuevotipo depublicación ymaneje las reglas de reescritura ustedmismo así<?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' );
Puede ver que la llamada
add_permastruct
ahora yanoincluyeel slug. Probé dosescenarios:- Cuando creé unapágina con labarra "calendario",esapágina se sobrescribe conel archivo detipo depublicación,quetambién usa labarra "calendario".
- Cuando creé unapágina con labarra "mi-evento" y unevento (CPT) con labarra "mi-evento",semuestraeltipo depublicaciónpersonalizada.
- Las demáspáginastampocofuncionan. Si observa laimagen de arriba,queda claropor qué: la regla detipo depublicaciónpersonalizada siempre coincidirá con unapágina slug. Debido a que WordPressnotiene forma deidentificar sies unapágina o untipo depublicaciónpersonalizada quenoexiste,devolverá 404. Esporeso quenecesita un slugparaidentificar lapágina oel CPT. Unaposible solución seríainterceptarelerror ybuscar unapágina quepudieraexistir similar aesta respuesta .
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.
-
Entonces,siel objetivoeseliminarel slug de los CPT,¿nopodríamosnombrar al CPT como algo único queno colisionaría,ya que detodosmodosnunca se veráen la URL?¿Oeselpost-nombreelposible conflicto si senombraigual que unapágina?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
-
Actualicémi respuestaparamostrar queesto realmente rompe *todas * laspáginas.Sin slug,WPbuscará un CPTen lugar de unapágina y,sino loencuentra,devolverá unerror.Entonces,en realidad,noestá relacionado conelnombre de lapublicación.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
-
Veo.Debería haber reglas de reescritura que agreguen '-1' afuturas URLen conflicto,comopublicacionesnativas de WPfrente apáginas.Creé unboleto de seguimiento https://core.trac.wordpress.org/ticket/34136#ticket queme encantaría conocertu opinión.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
Resumen de complementos
Es casi 2020 ymuchas deestas respuestasnofuncionan. Aquíestámi propio resumen de las opciones actuales:
- La respuesta de Matt Keys parece ser la únicaen el camino correcto si desea una solución de códigopersonalizado. Ninguno de los complementos queencontrépuede hacertodo lo que seenumera aquí,especialmente la verificación de duplicados. Esteenfoqueparece unamuybuena oportunidadpara un complemento si alguien quisiera adoptarlo.
- Permalink Manager Lite
- Lomejor de los complementosgratuitos queprobé.
- Da controltotal sobretoda laestructura completa deenlacespermanentes de Página/Publicación/CPT ypermite que seaniguales. La GUIes,conmucho,lamás ricaen funciones.
- Tambiénpermite la anulación completaporpublicación y lepermite ver cuál seríael original/predeterminado y restablecerel valorpredeterminado siesnecesario.
- Admite varios sitios.
- No busca duplicadosentretipos depublicaciones,lo cualestriste. Si unapágina y un CPTtienen lamisma URL,lapágina se carga yel CPTesinaccesible. Sin advertenciasni errores,solotiene que hacer supropia verificaciónmanual de duplicados.
- Todas lasfunciones detaxonomíaestánen la versión PRO. Losproblemas de actualización sonbastantepesados.
- Vínculospermanentespersonalizados
- La versióngratuita hacemucho. Losenlacespermanentes detaxonomía yel soportepremiumparecen ser las únicas cosas que se retienen de la versiónpro.
- Lepermite cambiarelenlacepermanente completo para cualquierpágina/publicación/CPTindividual.
- Admite varios sitios.
- No te permite cambiar laestructurapredeterminada,por lo quetustipos depublicacionespersonalizadas seguirán siendoexample.com/cpt-slug/post-title,peropuedes cambiarlosindividualmente.
- No comprueba si hay duplicadosentretipos depublicaciones,lo cualestriste.
- Enlacespermanentes detipo depublicaciónpersonalizada
- Permite a los usuarios queno son desarrolladores cambiar las cosas que ya sonfáciles de cambiar con
register_post_type
- No lepermite cambiarel slugbase de CPT,solo laparte que viene después,por lo queesprácticamenteinútilpara los desarrolladores yelproblemaen estapregunta.
- Permite a los usuarios queno son desarrolladores cambiar las cosas que ya sonfáciles de cambiar con
- eliminarel slugbase ... -muerto desde hace varios años ...no lo use.
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.
-
El complemento Permalink Manager Litees definitivamente lamejor solución:estable,robusto,limpio y la versióngratuita lepermiteeliminar labase de slug.¡Ytambiénfunciona con Polylang!Probadoen Wordpress 5.4,con TwentyTwenty Theme,sinningún otro complemento activado.Funciona como unencantoen eltipo depublicaciónpersonalizada,sinimportar si ha creado unajerárquica (conpublicación secundaria ypublicación secundaria).Detodos los que quieren una solución limpia.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
Nonecesitatanto código.Simplemente use un complemento ligero:
Tiene opcionespersonalizables.
You dont need so much hard-code. Just use lightweight plugin:
It has customizable options.
-
Ahora sépor quéte votaronnegativamente,evita que losenlaces depáginanormales se resuelvan.No lo viporqueestaba obteniendo copiasen caché de laspáginasexistentes apesar de actualizar.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 ¿Puedes contarme sobreelproblemaen detalle?@Walf Can you tell me about the issue in details?
- 0
- 2017-09-14
- T.Todua
-
Seguirenlaces apáginas (quenoeran deltipo depublicaciónpersonalizada) desdeelmenúprincipal arrojabaerrores 404,como si lapáginanoexistiera;Esoes.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
-
@Walf,¿puede darme algúnejemplo de URL de su ocasión?(puede cubrirelnombre de dominio si lo desea,solonecesito unejemplo anterior)gracias,lo actualizaré@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
-
"Este complemento se cerróel 19 de septiembre de 2018 ynoestá disponiblepara descargar. Este cierreespermanente"."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
ypodemos realizar algunos cambiosen lafunciónmencionada anteriormente:
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' ) ); } }
para:
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 ); } }
paraestablecerel valor depost_type correcto.
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
Estofuncionóparamí:
'rewrite' => array('slug' => '/')
This worked for me:
'rewrite' => array('slug' => '/')
-
Estonofunciona.Da 404incluso cuando ha actualizado losenlacespermanentes.This doesn't work. Gives 404 even when you've updated permalinks.
- 1
- 2017-11-12
- Christine Cooper
-
- 2017-05-29
Para cualquiera que leaesto ytengaproblemas con laspublicaciones deniños como yo,encontré que lamejormaneraera agregar suspropias reglas de reescritura.
Elproblemaprincipal queteníaera que WordPresstratael redireccionamiento depáginas quetienen 2niveles (publicaciones secundarias) deforma unpoco diferente de lo quetrata 3niveles deprofundidad (publicaciones secundarias).
Eso significa que cuandotengo/post-type/post-name/post-child/puedo usar/post-name/post-child yme redirigirá al quetiene post-type alfrente,pero sitengopost-type/post-name/post-child/post-grandchild,entoncesnopuedo usarpost-name/post-child/post-grandchild.
Echando un vistazo a las reglas de reescritura,parece que coincide con otras cosas además delnombre de lapáginaen elprimer y segundonivel (creo queel segundonivel coincide conel archivo adjunto) y luego hace algo allípara redirigirte a lapublicación adecuada. Entresniveles deprofundidadnofunciona.
Loprimero que debe hacereseliminartambiénelenlace detipo depublicación de losniños. Esta lógica debería ocurrir aquí si observa la respuesta de Nate Allen anterior:
$post_link = str_replace( '/' . $post->post_type . '/', '/', $post_link );
Yomismo utilicé una combinación de diferentes condicionalespara verificar si lapublicacióntenía hijos ytodoesopara llegar alenlacepermanente correcto. Estapartenoes demasiado complicada yencontrarásejemplos depersonas que lo hacenen otros lugares.
Sinembargo,el siguientepasoes donde las cosas cambian apartir de la respuesta dada. En lugar de agregar cosas a la consultaprincipal (quefuncionóparapublicacionespersonalizadas y sus hijos,peronopara los demásniños),agregué una reescritura quefue alfinal de las reglas de WordPresspara que sielnombre de lapáginano se revisara yestaba apunto de Si llega a un 404,haría una última comprobaciónpara ver si unapágina dentro deltipo depublicaciónpersonalizadateníaelmismonombre; de lo contrario,arrojaríael 404.
Aquíestá la regla de reescritura que usé asumiendo que 'evento'eselnombre de su 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);
Espero queesto ayude a alguienmás,nopudeencontrarnadamás quetuviera que ver con laspublicaciones secundarias yeliminandoel slug deellas.
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.
-
Parece haber unerrortipográficoen laexpresión regular.Entre '(:' un '?' Esnecesariopara usarlo como subpatrón queno captura=> '(?:'. Eltercero? Parecefuera de lugar ya quepermite unprimer subpatrón vacío. Probablemente deberíaestar ubicadoentre (y:.Sinesteerrortipográfico,laexpresión será lamisma que sepuedeencontrarparaeltipo depublicaciónincorporada 'página'.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
Tuve losmismosproblemas aquí yparece queno haymovimientoen el sitio de wordpress.Enmi situaciónparticular,en la queparapublicaciones deblogindividuales,senecesitabaesta solución con laestructura/blog/%postname%/.
https://kellenmace.com/remove-custom-post-type-slug-from-permalinks/
terminóen unmontón de 404
Perojunto conesteenfoquemaravilloso,queno utiliza laestructura deenlacepermanente debackendpara lapublicación deblog,finalmentefunciona como unencanto. https://www.bobz.co/add-blog-prefix-permalink-structure-blog-posts/
Muchasgracias.
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.
-
No se recomiendan las respuestas de soloenlace.Siencontró una respuestaen este artículo quees diferente de las otras respuestasen lapágina,incluya un resumen y unejemplo de códigoen su respuesta.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
Parece quetodos los recursos webbasados eneltema deeliminar untipo depublicaciónpersonalizada slug,es decir
ahora son solucionesmuy desactualizadas que amenudo hacen referencia ainstalaciones anteriores a la versión 3.5 de WP. Uno comúnes:
dentro de sufunción register_post_type. Esto yanofunciona yesengañoso. Así que lepregunto a la comunidaden eltercertrimestre de 2018 alborde de WordPress 5 ...
¿Cuáles son lasformasmodernas yeficientes deeliminar labarra detipo depublicación de la URL de unapublicación detipo depublicaciónpersonalizada desdeel argumento de reescritura oen cualquier otro lugar?
ACTUALIZAR: Parece que hay variasformas deforzar queestofuncione conexpresiones regulares. Específicamente,la respuesta de Jan Becken caso de queesté constantemente dispuesto amonitorear la creación de contenidoparagarantizar queno se creennombres depáginas/publicacionesen conflicto ... Sinembargo,estoy convencido de queestaes una debilidadimportanteen elnúcleo de WP,donde deberíamanejarsepornosotros . Tanto como una opción/gancho al crear un CPT o un conjunto avanzado de opcionesparaenlacespermanentes. Apoyaelticket de lapista.
Nota apie depágina: apoyeesteticket de seguimientomirándolo/promocionándolo: https://core .trac.wordpress.org/ticket/34136 #ticket