Ich würde gerne wissen, wie ich eine Such-URL, die auch eine zusätzliche Abfrage Var enthält, in einen schönen Permalink mit wp_redirect
und dem template_redirect
Hook umschreiben kann.
Ich habe den Code aus dem Nice Search Plugin genommen, der gut funktioniert, um http://example.com?s=africa
in http://example.com/search/africa
zu ändern:
add_action( 'template_redirect', 'my_rewrite' ) ); function my_rewrite() { if ( is_search() and false === strpos( $_SERVER['REQUEST_URI'], '/search/' ) ) { wp_redirect( get_bloginfo( 'home' ) . '/search/' . str_replace( ' ', '+', str_replace( '%20', '+', get_query_var( 's' ) ) ) ); exit(); } }
Aber ich verwende ein Auswahl-Dropdown in Kombination mit dem Relevanssi- Plugin, damit Besucher die Suche auf einen bestimmten Post-Typ eingrenzen können . Dies fügt eine Abfrage vom post_type
hinzu, zB http://example.com?s=africa&post_type=features
. Ich hätte gerne eine URL wie http://example.com/search/africa/section/features
.
Der Nice Search-Code bewirkt, dass die post_type-Abfrage var verloren geht. Also habe ich den folgenden Code ausprobiert:
function my_rewrite() { if ( is_search() and false === strpos( $_SERVER['REQUEST_URI'], '/search/' ) ) { if ( isset( $_GET['post_type'] ) and '' !== $_GET['post_type'] ) { wp_redirect( get_bloginfo( 'home' ) . '/search/' . str_replace( ' ', '+', str_replace( '%20', '+', get_query_var( 's' ) ) ) . '/section/' . str_replace( ' ', '+', str_replace( '%20', '+', get_query_var( 'post_type' ) ) ) ); } else { wp_redirect( get_bloginfo( 'home' ) . '/search/' . str_replace( ' ', '+', str_replace( '%20', '+', get_query_var( 's' ) ) ) ); } exit(); } }
aber WordPress denkt jetzt, dass der Suchbegriff africa/section/features
.
Gibt es eine Möglichkeit, den Suchbegriff und die Abfrage var alle in einem schönen Permalink zu halten?
Danke Simon
Um die Regeln für das Umschreiben von search_rewrite_rules
zu ändern, können Sie den Filter search_rewrite_rules
. Sie können entweder die zusätzlichen Rewrite-Regeln hinzufügen, die den Post-Typen entsprechen, oder Sie können die Standard-Suchumschreibungsstruktur ändern, um auch den Post-Typ einzuschließen und dann die Regeln neu zu generieren (es gibt vier Regeln: einen Standard, einen mit Paging) und zwei für Feeds). Da WP_Rewrite::generate_rewrite_rules()
Regeln auf jeder “Verzeichnisebene” generiert , erhalten Sie Regeln für /search/[keyword]/section/[post_type]/
, /search/[keyword]/section/
und /search/[keyword]/
. Du brauchst die mittlere Regel nicht, aber es wird nicht schaden, sie zu behalten.
add_filter( 'search_rewrite_rules', 'wpse15418_search_rewrite_rules' ); function wpse15418_search_rewrite_rules( $search_rewrite_rules ) { global $wp_rewrite; $wp_rewrite->add_rewrite_tag( '%post_type%', '([^/]+)', 'post_type=' ); $search_structure = $wp_rewrite->get_search_permastruct(); return $wp_rewrite->generate_rewrite_rules( $search_structure . '/section/%post_type%', EP_SEARCH ); }
Um die Regeln zu überprüfen, benutze mein Rewrite Analyzer Plugin .