Durch Hinzufügen des Überschreib-Endpunkts wird die statische Titelseite unterbrochen

Ich habe statische Startseite für meine WP-Installation eingestellt von settings > reading . Dann habe ich einen URL-Endpunkt mit hinzugefügt.

 add_rewrite_endpoint('foo', EP_ALL); 

So sollte die Startseite über erreichbar sein

 http://example.com/ http://example.com/foo http://example.com/foo/bar 

Für # 1 Alles funktioniert gut, aber für # 2 und # 3 wird default home.php statt der statischen Homepage angezeigt. Getestet lokal bei der Einzel- und Multisite-Installation.

Ist es ein gewünschtes Verhalten oder ich treffe etwas Ungewöhnliches? Noch wichtiger, wie kann ich WP dazu bringen, die statische Homepage unter den gegebenen Bedingungen zu zeigen?

Lösung

Ich war bereits in parse_request , um einen Teil des Codes zu verarbeiten, wenn foo existiert. Also, wie in der @ gmazzap-Lösung. Ich muss es nur danach aufheben. Es ist keine zusätzliche hooked-function erforderlich, um den Fehler zu umgehen.

 add_action('parse_request', function(&wp){ $key = 'foo'; if (!array_key_exists( $key, $wp->query_vars ) ) { return; } // do things when foo exists // we no longer need 'foo' unset($wp->query_vars[$key]); }); 

Solutions Collecting From Web of "Durch Hinzufügen des Überschreib-Endpunkts wird die statische Titelseite unterbrochen"

Vielleicht habe ich das nicht sehr gut verstanden, aber wenn du 'foo' von 'foo' query vars 'foo' entfernen möchtest, wäre es nicht viel einfacher, den 'request' Filter zu verwenden und die var von dort zu entfernen.

Code benötigt:

 add_filter('request', function($query_vars) { return array_diff_key($query_vars, array('foo'=>'')); }); 

Es:

  • läuft nur auf Hauptabfrage
  • Entferne die Variable für das $wp Objekt
  • agiert, bevor die Abfrage auf $wp_query , so dass die Abfrage nicht von dort entfernt werden muss
  • betrifft nicht alle anderen Variablen

Bearbeiten:

Ein Problem dieses Codes besteht darin, dass er sehr früh ausgeführt wird, so dass es schwierig sein wird, das Vorhandensein der Abfragevariablen abzufangen und etwas basierend auf seiner Anwesenheit / seinem Wert zu tun.

Eine Lösung könnte sein, die Bedingungen auf demselben 'request' request’ 'request' Filter auszuführen, kurz bevor die Abfrage var entfernt wird (z. B. indem der selbe Hook mit höherer Priorität verwendet wird).

Eine andere Lösung könnte ein Flag zu $wp Objekt hinzufügen:

 add_filter('request', function($query_vars) { $GLOBALS['wp']->_foo = isset($query_vars['foo']) ? $query_vars['foo'] : false; return array_diff_key($query_vars, array('foo'=>'')); }); 

Danach wäre es möglich, die Variable ‘foo’ in jedem Haken zu überprüfen, der nach 'request' ausgetriggers wurde, der früheste ist 'parse_request'

 add_action('parse_request', function($wp) { $foo = $wp->_foo; // do something with foo }); 

Das letzte ist 'shutdown' :

 add_action('shutdown', function() { $foo = $GLOBALS['wp']->_foo; // do something with foo }); 

Dies ist ein Fehler 25143, wie @toscho darauf hingewiesen hat und in 4.3 behoben wird

Workaround Im Ticket gefunden und ein wenig modifiziert

WordPress fügt foo als Abfrage-Variable hinzu, die das Problem verursacht. Also müssen wir es entfernen, bevor WP die database abfragt

 add_action( 'pre_get_posts', 'wpse191771_unset_query_arg' ); function wpse191771_unset_query_arg($query){ if ( is_admin() || ! $query->is_main_query() ) { return; } $key = 'foo'; $query_vars =& $query->query_vars; if ( array_key_exists($key, $query_vars) ) { // unset ref var from $wp_query $query->set( $key, null ); global $wp; // unset ref var from $wp unset( $wp->query_vars[ $key ] ); // if in home (because $wp->query_vars is empty) and 'show_on_front' is page if ( empty( $wp->query_vars ) && get_option( 'show_on_front' ) === 'page' ) { // reset and re-parse query vars $wp->query_vars['page_id'] = get_option( 'page_on_front' ); $query->parse_query( $wp->query_vars ); } } }