Warum funktioniert die Rewrite-Regel für die Seite, nicht für die benutzerdefinierte Post-Post?

Update: Ich habe gelesen, dass eine benutzerdefinierte Rewrite-Regel überschrieben werden kann und alle Parametervariablen löschen kann, wenn die benutzerdefinierte Rewrite-Regel auf einer untergeordneten Seite / Post verwendet wird. Die Post, für die meine benutzerdefinierte Neuschreibungsregel gedacht ist, ist kein Kind / Elternteil, aber Teil eines benutzerdefinierten Posttyps. Könnte das ähnliche Umschreibprobleme verursachen (gelöschte Parametervariablen)?

Update 2 (Problem getriggers): Wie in dem Update oben erwähnt, verursachte die Tatsache, dass es sich um eine Rewrite-Regel für einen benutzerdefinierten Post-Post handelt, das Problem. Bitte beachten Sie meine Antwort für die Lösung.

Meine Frage

Wenn Sie den unten stehenden Code verwenden, scheint das eigentliche Post-Rewrite zu funktionieren, da es korrekt zum Post mit der ID 160 . Und das sogar bei Verwendung einer hübschen Parameter-URL. Aber sobald die URL des hübschen Parameters umgeleitet wird, zu dem Beitrag mit der ID 160, sind alle Parameterwerte verschwunden.

Wie kann ich WP dazu bringen, den benutzerdefinierten Parameter nicht zu löschen, wenn eine hübsche Parameter-URL verwendet wird?

Also eine URL wie:

site.com/post/parameter-value/

Sollte redirect (zum Post mit ID 160) wie folgt:

site.com/custom-post-type-slug/post-title-of-160/parameter-value/ (Parameterwert wird nicht gelöscht)

Der Code, den ich verwende

 function add_custom_query_vars($vars) { $vars[] = 'member_view'; return $vars; } add_filter('query_vars', 'add_custom_query_vars'); function add_rewrite_rules($rules) { $newrules = array('page/([^/]+)/?$' => 'index.php?page_id=158&member_view=$matches[1]', 'post/([^/]+)/?$' => 'index.php?p=160&member_view=$matches[1]'); $rules = $newrules + $rules; return $rules; } add_filter('rewrite_rules_array', 'add_rewrite_rules'); 

Die Details

Ich verwende den obigen Code, um URLs in hübsche URLs umzuschreiben, die mit hübschen benutzerdefinierten Parameterwerten enden. Folgendes funktioniert und was nicht funktioniert:

Für Seiten (das funktioniert)

Die Rewrite-Regel für Seiten funktioniert. Eine URL wie:

site.com/page/parameter-value/

Umleitung (auf die Seite mit ID 158) wie folgt:

site.com/page-title-of-158/parameter-value/

Und get_query_var('member_view') gibt parameter-value .

Für Beiträge (mit nicht-hübschen URL) (das funktioniert)

Bei Posts bleiben die Parameter nur bei Verwendung von “nicht hübschen” URLs erhalten:

site.com/?p=160&member_view=parameter-value

Oder:

site.com/custom-post-type-slug/post-title-of-160/?member_view=parameter-value

Beide redirect (zum Beitrag mit ID 160) wie folgt:

site.com/custom-post-type-slug/post-title-of-160/?member_view=parameter-value

Und der Wert member_view kann abgerufen werden.

Für Posts (mit hübscher URL) (das funktioniert nicht)

Wenn eine hübsche Parameter-URL verwendet wird, wird der benutzerdefinierte Parameter gelöscht, nachdem der Weiterleitungsprozess canonical.php abgeschlossen wurde. Also, eine URL, die wie folgt aussieht:

site.com/post/parameter-value/

Redirects (zum Post mit ID 160) wie folgt:

site.com/custom-post-type-slug/post-title-of-160/ (Parameterwert ist weg)

Und sowohl get_query_var('member_view') als auch $_GET['member_view'] geben nichts zurück.

Solutions Collecting From Web of "Warum funktioniert die Rewrite-Regel für die Seite, nicht für die benutzerdefinierte Post-Post?"

Nun, ich habe die Lösung gefunden. Es scheint, dass beim Anwenden einer Rewrite-Regel auf einen benutzerdefinierten Beitragstyp-Post WP den Namen des benutzerdefinierten Post-Typs innerhalb der Rewrite-Regel selbst mitteilen muss.

Hier ist der Code, der NICHT funktioniert (leitet um und löscht Parametervariablen anstatt neu zu schreiben):

 function add_rewrite_rules($rules) { $newrules = array('cpt-slug/([^/]+)/([^/]+)/?$' => 'index.php?p=$matches[1]&member_view=$matches[2]'); $rules = $newrules + $rules; return $rules; } add_filter('rewrite_rules_array', 'add_rewrite_rules'); 

Hier ist der Code, der funktioniert (schreibt und behält Parametervariablen):

 function add_rewrite_rules($rules) { $newrules = array('cpt-slug/([^/]+)/([^/]+)/?$' => 'index.php?p=$matches[1]&post_type=cpt_name&member_view=$matches[2]'); $rules = $newrules + $rules; return $rules; } add_filter('rewrite_rules_array', 'add_rewrite_rules'); 

Das Umschreiben funktionierte einmal &post_type=cpt_name wurde zu seiner Regel hinzugefügt. Ich bin erstaunt, dass dies nicht explizit in den Informationen zum Thema Rewrite Rules erwähnt wurde, die ich gefunden und gelesen habe (und ich habe 2 Tage lang gesucht) 🙂

Eine URL, die wie folgt aussieht:

site.com/cpt-slug/INSERT-ID-OF-CPT-POST/INSERT-PARAMETER-VARIABLE/

Wird nun korrekt umgeschrieben und die Parametervariablen werden nicht gelöscht. Die Parametervariable kann jetzt mit get_query_var('member_view') abgerufen werden.

Suchen Sie nach der function add_rewrite_tag . Sie müssen ein Tag hinzufügen, um jede Variable in einem Neuschreiben aufzufangen; oder es wird fallengelassen

In Ihrem Fall sollte dies den Trick bewirken:

 add_rewrite_tag( '%ps-cpt-parameter%', '([^/]+)'); add_rewrite_rule('post/([^/]+)/([^/]+)/?', 'index.php?p=$matches[1]&ps-cpt-parameter=$matches[2]', 'top' ); // And then you could get the variable with get_query_var('ps-cpt-parameter'); 

Übrigens, mit add_rewrite_rule Sie festlegen, ob Ihre benutzerdefinierten Regeln vor oder nach einer anderen Regel neu geschrieben werden sollen