Benutzerdefinierter Post-Typ 404s mit Neuschreiben sogar nach dem Zurücksetzen von Permalinks

Ich habe einen benutzerdefinierten Post-Typ erstellt, von dem die (vereinfachten) Argumente sind:

register_post_type( 'Event', 'public' => true, 'rewrite' => array( 'slug' => 'eventy'), 'has_archive' => false, 'hierarchical' => false ) 

Es funktioniert im Allgemeinen gut. Wenn ich jedoch versuche, die URLs in functions.php neu zu schreiben, zum Beispiel:

 function my_post_type_link_filter_function( $post_link, $id = 0, $leavename = FALSE ) { return str_replace('eventy', 'eventx', $post_link); } add_filter('post_type_link', 'my_post_type_link_filter_function', 1, 3); 

Das Ergebnis ist, dass die neuen “eventx” -URLs in von WordPress generierten Links, Listen usw. korrekt angezeigt werden. Aber wenn ich zu diesen “eventx” URLs gehe, bekomme ich einen 404. Das gehen zu einer “eventy” URL funktioniert immer noch.

Ich habe versucht, die Permalinks-Einstellungen zu Standard und zurück zu Post-Namen mehrmals zu ändern. Dies soll Permalinks zurücksetzen und behebt dieses Problem für viele Leute, die ich online gesehen habe. Nicht für mich.

Wer weiß, was die Ursache sein könnte? Wie gehe ich bei der Fehlersuche vor? Ich bin schwach auf die Theorie des URL-Umschreibens.

Wenn Sie interessiert sind, ist mein Zweck nicht die oben erwähnte triviale eventy → eventx Ersetzung. Ich möchte eigentlich in das Jahr / Monat ein Ereignis (nicht wenn es veröffentlicht wurde) in seine URL starten. Durch das Debugging wurde mir klar, dass ich ein grundlegenderes Problem hatte, da selbst dieses triviale x → y-Rewrite immer noch 404s austriggers.

Danke fürs Lesen!

[Klarstellung hinzugefügt]

Im Moment habe ich drei Events (Posts in meinem benutzerdefinierten Post-Typ) genannt sagen “Angelausflug”. Diese bekommen permalinks standardmäßig zugewiesen

  • mysite.com/events/fishing-trip
  • mysite.com/events/fishing-trip-2
  • mysite.com/events/fishing-trip-3

Was langweilig und unelegant ist.

Ich möchte stattdessen

  • mysite.com/events/2013/january/fishing-trip
  • mysite.com/events/2013/may/fishing-trip
  • mysite.com/events/2013/may/fishing-trip-2
  • mysite.com/events/2014/march/fishing-trip

Schöner und informativer.

Ich bin nicht daran interessiert, Kategorien wie Seiten zu haben

  • mysite.com/events/2013

Das Jahr und der Monat sind nur kosmetische in der URL.

Solutions Collecting From Web of "Benutzerdefinierter Post-Typ 404s mit Neuschreiben sogar nach dem Zurücksetzen von Permalinks"

Fügen Sie in Schritt 1 die Umschreibe-Tags für benutzerdefinierte Abfragejahr- und -monats-Abfragevariablen hinzu, und registrieren Sie dann den Ereignispostentyp mit diesen Tags im Slug-Argument des Umschreibarguments:

 function wpa83531_register_event_post_type(){ add_rewrite_tag('%event_year%','(\d+)'); add_rewrite_tag('%event_month%','(.+)'); register_post_type( 'event', array( 'public' => true, 'rewrite' => array( 'slug' => 'events/%event_year%/%event_month%' ), 'has_archive' => false, 'hierarchical' => false, 'supports' => array('custom-fields', 'title', 'editor') ) ); } add_action( 'init', 'wpa83531_register_event_post_type' ); 

Schritt 2, filtern Sie den Post-Typ-Link, um diese Tags durch Werte aus den benutzerdefinierten Feldern event_year und event_month zu ersetzen. Wenn die benutzerdefinierten Felder nicht vorhanden sind, werden einige Standardwerte eingefügt, sodass Sie mindestens einen Beitrag ohne Fehler in der Vorschau anzeigen können:

 function wpa83531_event_post_link( $permalink, $post, $leavename ) { if ( stripos( $permalink, '%event_year%' ) == false ) return $permalink; if ( is_object( $post ) && 'event' == $post->post_type ) { $default_year = '1970'; $default_month = 'january'; if( $event_year = get_post_meta( $post->ID, 'event_year', true ) ){ $permalink = str_replace( '%event_year%', $event_year, $permalink ); } else { $permalink = str_replace( '%event_year%', $default_year, $permalink ); } if( $event_month = get_post_meta( $post->ID, 'event_month', true ) ){ $permalink = str_replace( '%event_month%', $event_month, $permalink ); } else { $permalink = str_replace( '%event_month%', $default_month, $permalink ); } } return $permalink; } add_filter( 'post_type_link', 'wpa83531_event_post_link', 10, 3 ); 

Sie müssen ‘rewrite’ => false in Ihrem register_post_type () setzen; und nach dem Schließen von register_post_type () hinzufügen:

 // 404 CPT WP bug... global $wp_rewrite; $projet_structure = '/projets/%projet%'; $wp_rewrite->add_rewrite_tag("%projet%", '([^/]+)', "projet="); $wp_rewrite->add_permastruct('projet', $projet_structure, false); 

Wo Projekt ist mein CPT.

Sie können hier nach mehr suchen.