Brauchen Sie Hilfe mit add_rewrite_rule

LÖSUNG


Ich bin mit Update 3 gegangen und habe es funktioniert. Was ich falsch verstanden hatte, war, dass ich glaubte, dass eine Rewrite-Regel designers/?designer=some-designer&bid=9 zu /designers/some-designer ändern würde. Aber es ist natürlich umgekehrt.


Ich habe einige Nachforschungen angestellt, aber ich verstehe nicht, wie man add_rewrite_rule () benutzt .

Dieser Beitrag ist ziemlich nah an dem, was ich brauche, aber brauche ich wirklich so viel Code?

Mein aktueller Link ist das:
http://www.norwegianfashion.no/designers/?designer=Batlak-og-Selvig&bid=9
Was ich will ist das
http://www.norwegianfashion.no/designers/Batlak-og-Selvig/

  1. Wie add_rewrite_rule() ich add_rewrite_rule() ?
  2. Ich muss die Designer-ID (Gebot) übergeben. Wie kann ich das tun, wenn re.write Regeln verwendet werden, ohne dass es in der URL angezeigt wird?

Update 1

Ich fand das etwas erklärender. Aber es funktioniert nicht:

 function add_rewrite_rules( $wp_rewrite ) { $new_rules = array( '('.$template_page_name.')/designers/(.*?)/?([0-9]{1,})/?$' => 'designers.php?designer='. $wp_rewrite->preg_index(1).'&bid='. $wp_rewrite->preg_index(2) ); // Always add your rules to the top, to make sure your rules have priority $wp_rewrite->rules = $new_rules + $wp_rewrite->rules; } add_action('generate_rewrite_rules', 'add_rewrite_rules'); function query_vars($public_query_vars) { $public_query_vars[] = "designer"; $public_query_vars[] = "bid"; return $public_query_vars; } add_filter('query_vars', 'query_vars') 

Update 2

Hier ist eine andere Lösung die ich ausprobiert habe, die Jan Fabry in einem anderen Thread vorgeschlagen hat. Ich habe dies in meine functions.php eingefügt, aber es hat keine Wirkung.

 add_action('generate_rewrite_rules', 'add_rewrite_rules'); add_filter('query_vars', 'query_vars'); /* Custom re-write rules for desigenrs ------------------------------------------------------------------------------*/ function add_rewrite_rules( $wp_rewrite ) { add_rewrite_rule('^designers/([^/]*)/([^/]*)$ /designers/?designer=$1&bid=$2 [L]', 'top'); flush_rewrite_rules(false); } function query_vars($public_query_vars) { $public_query_vars[] = "designer"; $public_query_vars[] = "bid"; return $public_query_vars; } 

Update 3
Ich habe hier auch ein paar Beispiele gefunden . Aber das funktioniert auch nicht 🙁

 add_filter('rewrite_rules_array','wp_insertMyRewriteRules'); add_filter('query_vars','wp_insertMyRewriteQueryVars'); add_filter('init','flushRules'); // Remember to flush_rules() when adding rules function flushRules(){ global $wp_rewrite; $wp_rewrite->flush_rules(); } // Adding a new rule function wp_insertMyRewriteRules($rules) { $newrules = array(); $newrules['(designers)/(\d*)$'] = 'index.php?pagename=designers&designer=$matches[1]'; return $newrules + $rules; } // Adding the bid var so that WP recognizes it function wp_insertMyRewriteQueryVars($vars) { array_push($vars, 'designer'); return $vars; } 

Update 4 Ich habe auch diese Lösung versucht, aber immer noch keinen Erfolg.

 add_filter('search_rewrite_rules', 'designers_createRewriteRules'); function designers_createRewriteRules($rewrite) { global $wp_rewrite; // add rewrite tokens $designer_token = '%designers%'; $wp_rewrite->add_rewrite_tag($designer_token, '(.+)', 'designers='); $bid_token = '%bid%'; $wp_rewrite->add_rewrite_tag($bid_token, '(.+)', 'bid='); $keywords_structure = $wp_rewrite->root . "designers/$designer_token/$bid_token"; $keywords_rewrite = $wp_rewrite->generate_rewrite_rules($keywords_structure); return ( $rewrite + $keywords_rewrite ); 

}

Update 5
Es scheint, dass meine Rewrite-Regeln nicht hinzugefügt werden. Die folgenden neuen Regeln werden ausgeführt: print_r($wp_rewrite) , enthält meine neuen Rewrite-Regeln nicht.

Update 6
Ich habe Jans Lösung getestet. Aber die URL ändert sich nicht 🙁

 /* Initiation script for NF template ------------------------------------------------------------------------------*/ add_action('after_setup_theme','norwegianfashion_setup'); if ( ! function_exists( 'norwegianfashion_setup' ) ): function norwegianfashion_setup() { /* Here I do a lot of stuff */ // SEO friendly URL for desigenrs add_action( 'init', 'wpa5413_init' ); add_filter( 'query_vars', 'wpa5413_query_vars' ); } endif; /* Custom re-write rules for desigenrs ------------------------------------------------------------------------------*/ function wpa5413_init() { // Remember to flush the rules once manually after you added this code! add_rewrite_rule( 'designers/([^/]+)/?', 'index.php?pagename=designers&designer=$matches[1]', 'top' ); } function wpa5413_query_vars( $query_vars ) { $query_vars[] = 'designer'; return $query_vars; } 

Ich würde es wirklich schätzen, wenn jemand mir helfen könnte, dieses Problem zu lösen.

Solutions Collecting From Web of "Brauchen Sie Hilfe mit add_rewrite_rule"

Einige Hintergrundinformationen zu Rewrite-Regeln

Das WP Rewrite-System sieht kompliziert aus, aber es ist nicht schwer zu verstehen, wie es funktioniert. Es wird verwendet, um hübsche URLs ( /designers/ ) zu analysieren, als wären sie nicht hübsch ( /index.php?pagename=designers ). Die Grundidee ist, dass Sie eine Liste von Rewrite-Regeln haben , reguläre Ausdrücke, die die eingehenden URLs abgleichen können, und sie in andere URLs umschreiben, meist in der Form von index.php mit einigen Abfragevariablen. Diese Variablen werden auf Teile des regulären Ausdrucks gesetzt, der der URL entspricht. Die Regeln werden von oben nach unten ausgewertet. Wenn also zwei Regeln übereinstimmen, “gewinnt” die erste.

Diese Umschreibungsregeln werden in der database gespeichert, indem flush_rewrite_rules() , aber da das Generieren und Schreiben dieser Regeln eine teure Operation ist, sollten Sie dies nicht bei jeder init tun. Stattdessen tun Sie das nur, wenn Sie die Regeln ändern: wahrscheinlich bei der Aktivierung des Plugins (mit Hilfe von register_activation_hook() ), oder manuell, indem Sie die Permalinks Einstellungen Seite besuchen ( weil es bei der Aktivierung des Themas schwer ist ). Wenn Sie die Regeln nicht add_rewrite_rule() , hat das Aufrufen von add_rewrite_rule() keine Auswirkung. Es ist kein Problem, add_rewrite_rule() bei jeder add_rewrite_rule() , auch nachdem Sie die Regeln add_rewrite_rule() .

Es gibt viele Möglichkeiten, Ihre Umschreibungsregeln hinzuzufügen, und wenn Sie nur eine Regel hinzufügen möchten, können Sie dies mit add_rewrite_rule() tun. Da die Regeln für Posts, Seiten, Taxonomien, … zu mehreren Regeln führen, werden sie mit functionen auf add_rewrite_tag() Ebene wie add_rewrite_tag() , add_permastruct() , … erstellt. Diese sind jedoch für den einfachen Fall, den wir hier haben, nicht erforderlich.

Es gibt auch einige Filter, so dass Sie Ihre Regeln auch mit den Hooks generate_rewrite_rules oder generate_rewrite_rules_array hinzufügen können. Diese geben Ihnen sehr detaillierte Kontrolle über die vollständigen Regeln, aber add_rewrite_rule() ist genug, wenn Sie nur eine Regel hinzufügen möchten.

Ich habe ein kleines Plugin erstellt, mit dem Sie die aktuellen Rewrite-Regeln analysieren können , und (natürlich) empfehle ich Ihnen, es zu verwenden, wenn Sie versuchen, etwas zu ändern.

Erhalten Sie Ihre zusätzlichen Informationen von der URL

Lassen Sie uns auf das Beispiel aufbauen, das Sie gegeben haben. Sie haben die Designermarke Batlak og Selvig , mit der Nummer ID ( bid ) 9 . Sie möchten diese ID nicht in der URL, sondern nur den Namen. Wir nennen die URL-freundliche Version des Namens (ohne Leerzeichen oder Sonderzeichen) die Slug : Batlak-og-Selvig .

Im Allgemeinen sollte die URL alle Informationen enthalten, um den Inhalt zu identifizieren, den Sie auf der Seite anzeigen möchten. Sie können Cookies oder POST-Anfragen verwenden, um die tatsächliche Designer-ID zu speichern, die Sie anzeigen möchten, aber diese wird zusammenbrechen, wenn jemand den Link teilt, per E-Mail, Facebook, Twitter, oder einfach nur telefonisch vorlesen. Wenn Sie die numerische ID in Ihrer URL nicht verwenden möchten, sollten Sie sicherstellen, dass der Slug eindeutig ist: Dann suchen Sie zuerst die ID auf der Grundlage des Slugs und fahren fort wie zuvor.

Was wir jetzt gelernt haben, ist, dass wir eine Rewrite-Regel für das Muster /designers/ gefolgt von allem bis zum nächsten / hinzufügen und dieses “alles” in der Abfragevariablen designer_slug speichern wollen. In Ihrem Fall glaube ich, dass Sie auch die Seite mit den Slug- designers als allgemeinen Seiteninhalt verwenden wollen, also werden wir WordPress das auch sagen.

 add_action( 'init', 'wpa5413_init' ); function wpa5413_init() { // Remember to flush the rules once manually after you added this code! add_rewrite_rule( // The regex to match the incoming URL 'designers/([^/]+)/?', // The resulting internal URL: `index.php` because we still use WordPress // `pagename` because we use this WordPress page // `designer_slug` because we assign the first captured regex part to this variable 'index.php?pagename=designers&designer_slug=$matches[1]', // This is a rather specific URL, so we add it to the top of the list // Otherwise, the "catch-all" rules at the bottom (for pages and attachments) will "win" 'top' ); } 

Das einzige, was noch zu tun ist, ist WordPress mitzuteilen, dass auch der designer_slug in den Abfragevariablen enthalten sein soll, damit Sie später darauf zugreifen können. WordPress verwendet eine Whitelist von erlaubten Abfragevariablen, um zu verhindern, dass Benutzer jeden Parameter der Abfrage über die URL ändern. Alles was nicht auf dieser Liste steht wird ignoriert. Haken Sie sich einfach in den hook ” query_vars und fügen Sie Ihre zusätzliche Variable hinzu:

 add_filter( 'query_vars', 'wpa5413_query_vars' ); function wpa5413_query_vars( $query_vars ) { $query_vars[] = 'designer_slug'; return $query_vars; } 

Wie Sie sehen können, ist diese Antwort im Grunde die gleiche wie meine vorherige Antwort , aber ohne die Regel im Code zu spülen (so dass Sie es in der functions.php Ihres Themas anstelle eines Plugins verwenden können), und mit ein bisschen mehr Sicherheit und Erklärung weil ich seit dem (und wegen) der Beantwortung Ihrer ersten Frage viel über Umschreibregeln gelernt habe.

Chatroom-Diskussion

Wir haben letzte Fragen für diese Frage im Chat-Raum geklärt. Am Ende hat Steven den hook generate_rewrite_rules , weil die function add_rewrite_rule() nicht für ihn funktionierte.