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

15

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 non SUGGÉRÉ. Cela nécessitera une réécriture de WP, je le sais beaucoup.

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

Rob Bennet
la source
J'ai toujours voulu en savoir plus, je n'ai jamais pensé à poser la question. Merci!
fischi
@robbennet en 2015, il ne semble toujours pas être un moyen légitime de le faire avec style.
Ben Racicot

Réponses:

9

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

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 des règles de réécriture 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 vider les règles de réécriture, alors allez dans Paramètres - Permaliens et enregistrez les modifications.

Bartosz
la source
1
Vous ne devriez pas ajouter de règles de réécriture sur init. Vous devez simplement ajouter votre règle aux règles actuelles.
Chris_O
2
@Chris_O Pouvez-vous élaborer? Comment ajouter la règle aux règles actuelles?
Desi
Après avoir ajouté ce code, toutes mes pages ayant des URL comme exemple.com/about-us ont cessé de fonctionner? Des solutions pour cela?
Rahul Gupta
4

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 de permalien est "/% postname % /

swtshweta
la source
Exactement ce plugin est génial! Je suis un utilisateur expérimenté de ce plugin et je le recommande totalement! voici le lien du site du plugin qui l'explique en profondeur ultimatewebtips.com/remove-slug-from-custom-post-type
Kuldeep Daftary
C'est un joli plugin, et a exactement la fonctionnalité que je cherchais. La solution @bartosz concerne spécifiquement un CPT, bien que vous en ayez également une idée générale. Après avoir creusé dans ce plugin, tout est clair maintenant, merci!
fischi
0

Vous pouvez toujours vous connecter à "parse_request" pour effectuer une vérification pour voir s'il existe un type personnalisé avec le nom demandé, puis modifier les requêtes_vars de manière appropriée. Vous aurez besoin de quelque chose dans le sens 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 cependant que vous n'aurez pas de noms de publication portant le même nom qu'un nom de publication, sinon la publication n'apparaîtra jamais car elle correspond d'abord à un type d'événement.

Zakalwe
la source
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');

vider / recycler les réécritures d'URL, puis modifier .htaccess

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