Eliminar el slug de tipos de contenido personalizados de la URL

28 sept 2012, 06:33:03
Vistas: 18.1K
Votos: 15

No he encontrado una respuesta útil para esto. Soy consciente de los conflictos potenciales y problemas que puede causar, pero me interesa saber si es POSIBLE (no recomendable). Sé que esto requerirá reescrituras de WordPress.

Básicamente, supongamos que tenemos un CPT de "eventos". Quiero que la página de un evento individual tenga la URL http://dominio.com/evento-individual y NO http://dominio.com/eventos/evento-individual. ¿Alguna idea sobre cómo hacerlo?

2
Comentarios

Siempre quise saber sobre eso, nunca se me ocurrió hacer la pregunta. ¡Gracias!

fischi fischi
13 dic 2012 16:27:43

@robbennet en 2015 todavía no parece haber una forma legítima de hacer esto con estilo.

Ben Racicot Ben Racicot
28 sept 2015 18:58:41
Todas las respuestas a la pregunta 4
3

Así es como puedes hacer la primera parte del trabajo - eliminar el slug del CPT en el enlace del post (por ejemplo, para el tipo de entrada 'news').

function df_custom_post_type_link( $post_link, $id = 0 ) {  

    $post = get_post($id);  

    if ( is_wp_error($post) || 'news' != $post->post_type || empty($post->post_name) )  
        return $post_link;  

    return home_url(user_trailingslashit( "$post->post_name" ));  
}
add_filter( 'post_type_link', 'df_custom_post_type_link' , 10, 2 );

Ahora deberías añadir reglas de reescritura para 'news', porque obtendrás un error 404.

Añade la regla de reescritura así:

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

Luego necesitaremos limpiar las reglas de reescritura, así que ve a Ajustes - Enlaces permanentes y guarda los cambios.

13 dic 2012 16:56:11
Comentarios

No deberías estar agregando reglas de reescritura en init. Deberías simplemente agregar tu regla a las reglas actuales.

Chris_O Chris_O
19 dic 2012 08:36:04

@Chris_O ¿Puedes elaborar? ¿Cómo se agregaría la regla a las reglas actuales?

Desi Desi
25 ene 2015 15:26:29

Después de agregar este código, todas mis páginas que tienen URLs como http://example.com/about-us dejaron de funcionar. ¿Alguna solución para esto?

Rahul Gupta Rahul Gupta
15 dic 2016 10:09:04
3

Puedes probar este plugin (http://wordpress.org/extend/plugins/remove-slug-from-custom-post-type/) para eliminar el slug, pero solo funcionará si la estructura de permalinks es "/%postname%/".

13 dic 2012 16:56:39
Comentarios

¡Este plugin es increíble! Soy un usuario experimentado de este plugin y lo recomiendo totalmente.

Aquí está el enlace del sitio del plugin que lo explica en profundidad http://www.ultimatewebtips.com/remove-slug-from-custom-post-type/

Kuldeep Daftary Kuldeep Daftary
17 dic 2012 19:17:03

Este es un excelente plugin, y tiene exactamente la función que estaba buscando. La solución de @bartosz es para un CPT específico, aunque también se puede entender la idea general. Después de investigar este plugin, ahora todo está claro, ¡gracias!

fischi fischi
19 dic 2012 14:40:29

Este plugin ya no parece estar en el repositorio de WordPress. Sin embargo, puedes usar este otro plugin en su lugar... https://wordpress.org/plugins/remove-cpt-base/

clayRay clayRay
28 nov 2021 04:22:14
0
function register_cpt_type() {
    register_post_type('cpt', array(
        'rewrite' => array("slug" => "/cpt", "with_front" => false),
    ));
}
add_action('init', 'register_cpt_type')

function cpt_rewrite_rule() {
    add_rewrite_rule('(.*?)$', 'index.php?cpt=$matches[1]', 'top');
}
add_action('after_theme_setup', 'cpt_rewrite_rule');

vaciar/reciclar las reescrituras de URL, luego editar el archivo .htaccess

RewriteRule ^cpt/(.+)$ /$1 [R=301,L]
13 dic 2012 20:37:23
0

Siempre puedes engancharte a "parse_request" para realizar una verificación y ver si existe un tipo personalizado con el nombre solicitado, y luego modificar los query_vars apropiadamente. Necesitarás algo similar a la respuesta de @Bartosz para generar el enlace permanente además:

 add_filter('parse_request', "t21_parse_request" , 1, 1);

 function t21_parse_request($wpobj)
 {
      $query_vars = $wpobj->query_vars;
      $slug = $query_vars['pagename'];

      $posts = get_posts(array(
           "post_type" => "event",
           "post_name" => $slug
      ));

      if($posts)
      {
           //sabemos que existe tu entrada de "evento" así que ahora modificamos los query_vars
           //primero eliminamos 'page' y 'pagename'
           unset($query_vars['page']);
           unset($query_vars['pagename']);

           //ahora reconstruimos los query_vars
           $query_vars['post_type'] = "event"; //nombre del CPT
           $query_vars['name'] = $slug;
           $query_vars['event'] = $slug; //de nuevo - esto construye la cadena de consulta "event=myevent"
      }
      else
      {
           //simplemente retornamos $wpobj ya que sabemos que no hay un "evento"
           return $wpobj;
      }
 }

Esto asume sin embargo que no tendrás nombres de publicaciones con el mismo nombre que un postname, de lo contrario, la publicación nunca aparecerá ya que coincidirá primero con un tipo de evento.

13 dic 2012 21:55:52