Eliminar el tipo de mensaje personalizado de URL


15

No he encontrado una respuesta útil para esto. Soy consciente de los problemas de conflicto y todos los problemas que esto puede causar, tengo curiosidad por saber si es POSIBLE, no SUGERIDO. Esto requerirá reescrituras de WP, lo sé mucho.

Básicamente, digamos que tenemos un CPT de "eventos". Quiero que la página de un solo evento tenga la URL http://domain.com/single-event-name y NO http://domain.com/events/single-event-name . ¿Alguna idea sobre cómo hacerlo?


Siempre quise saber sobre eso, nunca pensé en hacer la pregunta. ¡Gracias!
fischi

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

Respuestas:


9

Así es como puede hacer la primera parte del trabajo: deshacerse de la babosa CPT en el enlace de publicación (por ejemplo, tipo de publicación de noticias).

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ía ir aa reglas de reescritura para 'noticias', porque obtendrá un error 404.

Agregue la regla de reescritura de esta manera:

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

Luego, tendremos que vaciar las reglas de reescritura, así que vaya a Configuración - Enlaces permanentes y guarde los cambios.


1
No deberías agregar reglas de reescritura en init. Simplemente debe agregar su regla a las reglas actuales.
Chris_O

2
@ Chris_O ¿Puedes dar más detalles? ¿Cómo agregaría la regla a las reglas actuales?
Desi

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

4

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


¡Exactamente este complemento es increíble! Soy un usuario experimentado de este complemento y lo recomiendo totalmente. aquí está el enlace del sitio del complemento que lo explica en profundidad ultimatewebtips.com/remove-slug-from-custom-post-type
Kuldeep Daftary

Este es un buen complemento, y tiene exactamente la característica que estaba buscando. La solución de @bartosz es específicamente para un CPT, aunque usted también obtiene la idea general. Después de profundizar en este complemento, todo está claro ahora, ¡gracias!
fischi

0

Siempre puede conectarse a "parse_request" para realizar una comprobación para ver si existe un tipo personalizado con el nombre solicitado y luego modificar query_vars de manera adecuada. Necesitará 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($wbobj)
 {
      $vars = $wpobj->query_vars;
      $slug = $query_vars['pagename'];

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

      if($posts)
      {
           //we know your "event" entry exists so we now amend the query_vars
           //first unset the 'page' and 'pagename'
           unset($query_vars['page']);
           unset($query_vars['pagename'];

           //now rebuild the query_vars
           $query_vars['post_type'] = "event"; //CPT name
           $query_vars['name'] = $slug;
           $query_vars['event'] = $slug //again - this constructs the "event=myevent" query string
      }
      else
      {
           //just return $wpobj since we know that there is no "event"
           return $wpobj;
      }
 }

Sin embargo, esto supone que no tendrá ningún nombre de publicación con el mismo nombre que una publicación, de lo contrario, la publicación nunca aparecerá ya que coincide con un tipo de evento primero.


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 URL reescribe, luego editar .htaccess

RewriteRule ^cpt/(.+)$ /$1 [R=301,L]
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.