web-dev-qa-db-fra.com

Supprimer le slug de type de message personnalisé de l'URL

Je n'ai pas trouvé de réponse utile à cela. Je suis conscient des problèmes de conflit et de tous les problèmes que cela peut causer, je suis curieux de savoir si c'est POSSIBLE et non suggéré. Cela nécessitera WP réécrit, je le sais bien.

Fondamentalement, disons que nous avons un CPT "d'événements". Je souhaite que la page d'un événement ait l'URL http://domain.com/single-event-name et NOT http://domain.com/events/single-event-name . Des idées sur la façon de s'y prendre?

15
Rob Bennet

Voilà comment vous pouvez faire la première partie du travail - se débarrasser du slug du CPT dans le lien du post (par exemple, type type de post).

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 );

Maintenant, il devrait y avoir une réécriture des règles pour 'news', car vous obtiendrez une erreur 404.

Ajoutez la règle de réécriture comme ceci:

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

Ensuite, nous aurons besoin de vider les règles de réécriture, alors allez dans Paramètres - Permaliens et enregistrez les modifications.

9
Bartosz

Vous pouvez essayer ce plugin ( http://wordpress.org/extend/plugins/remove-slug-from-custom-post-type/ ) pour supprimer le slug, mais cela ne fonctionnera que si la structure permalink est "/%après le nom%/

4
swtshweta
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');

rincer/recycler les réécritures d'URL, puis éditer .htaccess

RewriteRule ^cpt/(.+)$ /$1 [R=301,L]
0
kristina childs

Vous pouvez toujours vous connecter à "parse_request" pour vérifier si un type personnalisé portant le nom demandé existe et modifier ensuite les query_vars de manière appropriée. Vous aurez besoin de quelque chose dans la lignée de la réponse de @ Bartosz pour générer le permalien en plus:

 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;
      }
 }

Cela suppose toutefois que vous ne trouverez pas de nom d'article portant le même nom qu'un nom d'article, sinon l'article ne s'affichera jamais car il correspond d'abord à un type d'événement.

0
Zakalwe