Benutzerdefinierte Rewrite-Regel funktioniert nicht

Ich versuche, von dieser Art von URL zu kommen:

domain.com/page/classes/?language=english&need=pro 

Zu diesem:

 domain.com/class/english-pro 

MEHR INFORMATIONEN

Beide Variablen wurden als query_vars hinzugefügt. classes ist die aktuelle Seite und page ist die übergeordnete Seite.


WAS ICH VERSUCHT HABE

Hier ist die Rewrite-Regel, die ich versucht habe, aber es funktioniert nicht.

 function custom_rewrite() { add_rewrite_rule( 'class/([^/]+)-([^/]+)$', 'index.php?language=$matches[1]&need=$matches[2]', 'top' ); } add_action( 'init', 'custom_rewrite' ); 

Aus irgendwelchen Gründen kann ich den Ausdruck der Regex nicht verstehen … Danke für Ihre Hilfe!


AKTUALISIEREN 1

Mit ein bisschen Suche das, was ich gefunden habe:

 function custom_rewrite() { add_rewrite_tag( '%_language%', '([a-zA-Z\d\-_+]+)' ); add_rewrite_tag( '%_need%', '([a-zA-Z\d\-_+]+)' ); add_rewrite_rule( 'class/([a-zA-Z\d\-_+]+)-([a-zA-Z\d\-_+]+)?', 'index.php?_language=$matches[1]&_need=$matches[2]', 'top' ); } add_action( 'init', 'custom_rewrite' ); 

Aber es funktioniert immer noch nicht.


UPDATE 2

Ich habe einige Änderungen vorgenommen, damit die Umleitung einfacher wird. So funktioniert es:

  • Ich habe zwei Auswahlen in einer Form, mit der Leute eine language und ein need wählen können. Beide sind als Abfragevariablen deklariert.
  • Wenn das Formular validiert wird, lädt es diese URL: domain.com/page/classes/?_language=english&_need=pro .
  • Die Ergebnisseite lädt Informationen aus einem benutzerdefinierten Post-Typ, der mit der folgenden Struktursprache benannt ist : need . Ich erhalte die Informationen, indem ich einen query_posts , der den name aus den query_posts .

Nun, was ich will, ist einfach: die defaut-URL ( domain.com/page/classes/?language=english&need=pro ) auf diese neue URL ( domain.com/class/english-pro ) domain.com/class/english-pro dabei dieselben Informationen zu laden * *.


AKTUALISIEREN 3

Ich habe @jgraup Lösung unten ausprobiert (ohne die prefix__pre_post_link function, wie ich meine URL vereinfacht habe, um es nicht zu brauchen), aber es funktioniert nicht (mein kundenspezifischer Beitragstyp benutzt die gleichen Einstellungen

 if ( ! class_exists( 'PrefixClassesRewrites' ) ) { class PrefixClassesRewrites { const POST_TYPE_SLUG = 'lang'; function __invoke() { add_action( 'init', array ( $this, 'prefix__init' ) ); add_action( 'pre_get_posts', array ( $this, 'prefix__pre_get_posts' ) ); } public function prefix__init() { // custom query params that we check for later add_rewrite_tag( '%_language%', '([a-zA-Z\d\-_+]+)' ); add_rewrite_tag( '%_need%', '([a-zA-Z\d\-_+]+)' ); add_rewrite_tag( '%_page_class%', '_page_class' ); // rewrite rule to transform the URL into params add_rewrite_rule( 'class/([a-zA-Z\d\-_+]+)-([a-zA-Z\d\-_+]+)?', 'index.php?_language=$matches[1]&_need=$matches[2]&_page_class=1', 'top' ); flush_rewrite_rules(); // query_vars[ '_page_class' ] ) ) { // Convert the variables to a custom post type name. $name = implode( '-', array ( $query->query_vars[ '_langue' ], $query->query_vars[ '_besoin' ], ) ); // Add the name and post_type to the query. $query->query_vars[ 'name' ] = $name; $query->query_vars[ 'post_type' ] = array ( static::POST_TYPE_SLUG ); // Nothing else to do here. return; } } } $prefixClassesRewrites = new PrefixClassesRewrites(); $prefixClassesRewrites(); // kick off the process } 

Die Sache ist, dass sich nichts geändert hat, meine URL wird nicht neu geschrieben. Übrigens, soll das Neuschreiben in Betrieb sein, wenn es funktioniert?

Solutions Collecting From Web of "Benutzerdefinierte Rewrite-Regel funktioniert nicht"

Hoffe, das wird so wie für mich funktionieren.

 add_filter('rewrite_rules_array', 'insert_custom_rules'); add_filter('query_vars', 'insert_custom_vars'); function insert_custom_vars($vars){ $vars[] = 'main_page'; return $vars; } function insert_custom_rules($rules) { $newrules = array(); $newrules=array( 'page-name/(.+)/?' => 'index.php?pagename=page-name&main_page=$matches[1]' ); return $newrules + $rules; } 

Also, mit Hilfe der function get_query_var () können wir Wert von URL erhalten und entsprechend verwenden. Auf diese Weise können wir hübsche URLs bekommen.

Hinweis: Wenn Sie mehr als eine Regel haben, schreiben Sie diejenigen mit mehr Variablen zuerst und dann diejenigen mit weniger. Bitte geben Sie bei mehreren Variablen den statischen Inhalt zwischen Variablen an.

Es gibt viele Annahmen hier, aber vielleicht können Sie diese aufklären. Dies setzt voraus, dass Sie eine CPT erstellt haben, die wie folgt aussehen könnte:

 domain.com/page/class/english-pro 

Und konvertiert es in

 domain.com/page/class-english-pro 

In jedem Fall. Die URL verwendet die Parameter und ändert die Abfrage so, dass eine Seite angezeigt wird. CPT wurde hier hinzugefügt, so dass dieses Beispiel für jeden Out-of-the-Box funktioniert. Und der Permalink Rewrite wurde hinzugefügt, um den Permalink anzupassen.

Ich werde nicht sagen, dass dies die Antwort ist, aber es gibt hier einige Dinge, die dir helfen könnten.

 < ?php if ( ! class_exists( 'PrefixClassesRewrites' ) ) { class PrefixClassesRewrites { const POST_TYPE_SLUG = 'classes'; function __invoke() { add_action( 'init', array ( $this, 'prefix__init' ) ); add_action( 'init', array ( $this, 'prefix__init_cpt' ), 0 ); add_action( 'pre_get_posts', array ( $this, 'prefix__pre_get_posts' ) ); add_filter( 'post_type_link', array ( $this, 'prefix__pre_post_link' ), 3 ); add_filter( 'post_link', array ( $this, 'prefix__pre_post_link' ), 3 ); } /** * Register the custom post type. */ public function prefix__init_cpt() { $rewrite = array ( 'slug' => 'page/class', // get's closer but will end with / not - 'with_front' => false, 'pages' => true, 'feeds' => true, ); register_post_type( static::POST_TYPE_SLUG, array ( 'label' => __( 'Classes Post Type', 'text_domain' ), 'description' => __( 'Classes Post Type Description', 'text_domain' ), 'rewrite' => $rewrite, 'hierarchical' => false, 'public' => true, 'show_ui' => true, 'show_in_menu' => true, 'menu_position' => 5, 'show_in_admin_bar' => true, 'show_in_nav_menus' => true, 'can_export' => true, 'has_archive' => true, 'exclude_from_search' => false, 'publicly_queryable' => true, 'capability_type' => 'page', ) ); } /** * Add the rewrite rule and allow custom query params */ public function prefix__init() { // custom query params that we check for later add_rewrite_tag( '%_page_class%', '_page_class' ); add_rewrite_tag( '%_language%', '([a-zA-Z\d\-_+]+)' ); add_rewrite_tag( '%_need%', '([a-zA-Z\d\-_+]+)' ); // rewrite rule to transform the URL into params add_rewrite_rule( 'page/class-([a-zA-Z\d\-_+]+)-([a-zA-Z\d\-_+]+)?', 'index.php?_page_class=1&_language=$matches[1]&_need=$matches[2]', 'top' ); flush_rewrite_rules(); // < -- for testing only | removed once the rewrite rules are in place } /** * Modify the query to convert our params to a custom post type pagename * * @param $query */ public function prefix__pre_get_posts( $query ) { // Check for our custom query param. Really just a flag to do this if ( isset( $query->query_vars[ '_page_class' ] ) ) { // Convert the variables to a custom post type name. $name = implode( '-', array ( $query->query_vars[ '_language' ], $query->query_vars[ '_need' ], ) ); // Add the name and post_type to the query. $query->query_vars[ 'name' ] = $name; $query->query_vars[ 'post_type' ] = array ( static::POST_TYPE_SLUG ); // Nothing else to do here. return; } } /** * Rewrite the permalink to match our setup. * * @param string $permalink * @param null|WP_Post $post * @param bool $leavename * * @return string */ public function prefix__pre_post_link( $permalink = '', $post = null, $leavename = false ) { return str_replace( '/page/class/', '/page/class-', $permalink ); } } $prefixClassesRewrites = new PrefixClassesRewrites(); $prefixClassesRewrites(); // kick off the process } 

Okay, ich habe meine Denkweise geändert und da ich nicht weiß, wo das Problem herkommt, habe ich mich für eine andere Lösung entschieden.

Ich verwende ein wp_safe_redirect zu der URL des entsprechenden benutzerdefinierten Post-Typs .

Für diejenigen, die an der Lösung interessiert sind, ist meine Formularaktion der permalink einer Seite, die nur dafür erstellt wurde (nennen wir es class ).

Auf dieser classnseite habe ich folgende sichere Weiterleitung:

 // getting my variables from the url $language = get_query_var( '_language' ); $need = get_query_var( '_need' ); // redirecting to the corresponding custom post type url if( isset( $language ) && isset( $need ) ) { wp_safe_redirect( esc_url( home_url('/') ) .'class/'. $language .'-'. $need .'/', 301 ); exit; } else { // if variables are not defined // redirect to home (or whatever page you want) wp_safe_redirect( esc_url( home_url('/') ) ); exit; } 

Jetzt funktioniert alles super!