Entfernen Sie benutzerdefinierte Posts vom Typ "Slug" aus der URL


15

Habe keine sinnvolle Antwort dafür gefunden. Ich bin mir der Konfliktprobleme und aller Probleme bewusst, die dies verursachen kann. Ich bin neugierig, ob es MÖGLICH ist, nicht EMPFOHLEN zu werden. Dies erfordert WP-Umschreibungen, ich weiß so viel.

Angenommen, wir haben eine CPT von "Ereignissen". Ich möchte, dass die Seite eines einzelnen Ereignisses die URL http://domain.com/single-event-name und NICHT http://domain.com/events/single-event-name enthält . Irgendwelche Ideen, wie es geht?


Wollte das schon immer herausfinden, dachte nie daran, die Frage zu stellen. Vielen Dank!
Fischi

@robbennet im Jahr 2015 scheint es immer noch keinen legitimen Weg zu geben, dies mit Stil zu tun.
Ben Racicot

Antworten:


9

So können Sie den ersten Teil des Jobs erledigen - den CPT-Slug-In-Post-Link (z. B. Typ des Nachrichtenposts) loswerden.

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

Jetzt sollten Regeln für 'Nachrichten' neu geschrieben werden, da der Fehler 404 angezeigt wird.

Fügen Sie die Umschreiberegel wie folgt hinzu:

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

Dann müssen wir die Umschreiberegeln leeren, also gehen Sie zu Einstellungen - Permalinks und speichern Sie die Änderungen.


1
Sie sollten keine Umschreiberegeln für init hinzufügen. Sie sollten Ihre Regel nur zu den aktuellen Regeln hinzufügen.
Chris_O

2
@ Chris_O Können Sie das näher erläutern? Wie würde man die Regel zu den aktuellen Regeln hinzufügen?
Desi

Nachdem ich diesen Code hinzugefügt habe, haben alle meine Seiten mit URLs wie example.com/about-us aufgehört zu funktionieren? Irgendwelche Lösungen dafür?
Rahul Gupta

4

Sie können dieses Plugin ( http://wordpress.org/extend/plugins/remove-slug-from-custom-post-type/ ) zum Entfernen des Slugs verwenden, es funktioniert jedoch nur, wenn die Permalink-Struktur "/% postname" lautet % /


Genau dieses Plugin ist fantastisch! Ich bin ein erfahrener Benutzer dieses Plugins und kann es nur empfehlen! hier ist der Link von der Website - Plugin , das es in der Tiefe erklärt ultimatewebtips.com/remove-slug-from-custom-post-type
Kuldeep Daftary

Dies ist ein nettes Plugin und hat genau die Funktion, nach der ich gesucht habe. Die @bartosz-Lösung bezieht sich speziell auf einen CPT, obwohl auch Sie eine allgemeine Vorstellung davon haben. Nachdem Sie sich in dieses Plugin vertieft haben, ist jetzt alles klar, danke!
Fischi

0

Sie können jederzeit "parse_request" aufrufen, um zu überprüfen, ob ein benutzerdefinierter Typ mit dem angeforderten Namen vorhanden ist, und dann die query_vars entsprechend ändern. Um den Permalink zu generieren, benötigst du etwas in Anlehnung an die Antwort von @ Bartosz:

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

Dies setzt jedoch voraus, dass Sie keine Post-Namen mit dem gleichen Namen wie ein Post-Name haben. Andernfalls wird der Post nie angezeigt, da er zuerst mit einem Ereignistyp übereinstimmt.


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

URL neu schreiben, dann .htaccess bearbeiten

RewriteRule ^cpt/(.+)$ /$1 [R=301,L]
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.