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

14

Vous n'avez 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 des réécritures de WP, je le sais bien.

En gros, supposons que nous ayons un CPT "d'événements". Je souhaite que la page d'un seul événement ait l'URL enlace et NON enlace . Des idées sur la façon de s'y prendre?

    
posée Rob Bennet 28.09.2012 - 05:33

4 réponses

9

C’est comme ça que vous pouvez faire la première partie du travail - se débarrasser du slug du CPT dans le lien de publication (par exemple, type de publication de publication).

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, vous devriez procéder à une réécriture des règles pour les "nouvelles", 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 devrons effacer les règles de réécriture, accédez à Paramètres - Permaliens et enregistrez les modifications.

    
réponse donnée Bartosz 13.12.2012 - 15:56
4

Vous pouvez essayer ce plugin ( enlace ) pour supprimer le slug. , mais cela ne fonctionnera que si la structure de lien permanent est "/% postname% /

    
réponse donnée swtshweta 13.12.2012 - 15:56
0

Vous pouvez toujours vous connecter à "parse_request" pour vérifier si un type personnalisé portant le nom demandé existe, puis modifier les query_vars de manière appropriée. Vous aurez besoin de quelque chose comme les réponses 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 puisqu'il correspond d'abord à un type d'événement.

    
réponse donnée Zakalwe 13.12.2012 - 20:55
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');

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

RewriteRule ^cpt/(.+)$ /$1 [R=301,L]
    
réponse donnée kristina childs 13.12.2012 - 19:37

Lire d'autres questions sur les étiquettes