web-dev-qa-db-de.com

Brauchen Sie Hilfe mit add_rewrite_rule

LÖSUNG


Ich bin mit Update 3 gegangen und habe es zum Laufen gebracht. Was ich missverstanden hatte, war, dass ich glaubte, dass eine Umschreiberegel designers/?designer=some-designer&bid=9 in /designers/some-designer ändern würde. Aber es ist natürlich umgekehrt.


Ich habe einige Nachforschungen angestellt, aber ich verstehe nicht ganz, wie ich add_rewrite_rule () verwende.

Dieser Beitrag entspricht ziemlich genau dem, was ich brauche, aber brauche ich wirklich so viel Code?

Mein aktueller Link ist dieser:
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 verwende ich add_rewrite_rule()?
  2. Ich muss die Designer-ID (Gebot) übergeben. Wie kann ich das tun, wenn ich Re-Write-Regeln verwende, ohne dass sie in der URL angezeigt werden?

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, dass Jan Fabry in einem anderen Thread vorschlägt. Ich habe dies in meine functions.php eingefügt, aber es hat keine Auswirkung.

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 auch hier einige 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 ausprobiert, 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 Umschreiberegeln nicht hinzugefügt werden. Das Ausführen der folgenden nachträglichen neuen Regeln: print_r($wp_rewrite), schließt meine neuen Umschreiberegeln nicht ein.

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 mich wirklich freuen, wenn mir jemand bei der Lösung dieses Problems helfen könnte.

54
Steven

Hintergrundinformationen zu Umschreiberegeln

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

Diese Umschreiberegeln werden in der Datenbank gespeichert, indem flush_rewrite_rules() aufgerufen wird. Da das Generieren und Schreiben dieser Regeln jedoch eine kostspielige Operation ist, sollten Sie dies nicht für jede init tun. Stattdessen tun Sie dies nur, wenn Sie die Regeln ändern: Wahrscheinlich bei der Aktivierung des Plugins (mithilfe von register_activation_hook()) oder manuell über die Einstellungsseite Permalinks ( da dies bei der Themenaktivierung nur schwer automatisch möglich ist ). Wenn Sie die Regeln nicht löschen, hat der Aufruf von add_rewrite_rule() keine Auswirkung. Es ist kein Problem, add_rewrite_rule() für jede init aufzurufen, auch nachdem Sie die Regeln gelöscht haben.

Es gibt viele Möglichkeiten, um Ihre Umschreiberegeln 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 Funktionen auf hoher Ebene wie add_rewrite_tag(), add_permastruct(), ... erstellt. Diese werden jedoch in dem einfachen Fall, den wir hier haben, nicht benötigt.

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

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

Zusätzliche Informationen erhalten Sie über die URL

Bauen wir auf dem Beispiel auf, das Sie gegeben haben. Sie haben die Designermarke Batlak og Selvig mit der numerischen ID (bid) 9. Sie möchten nicht diese ID in der URL, sondern nur den Namen. Wir nennen die URL-freundliche Version des Namens (ohne Leerzeichen oder Sonderzeichen) 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. Dies wird jedoch aufgehoben, wenn jemand den Link teilt, indem Sie ihn per E-Mail, Facebook, Twitter oder einfach nur vorlesen laut am Telefon. Wenn Sie die numerische ID nicht in Ihrer URL verwenden möchten, sollten Sie sicherstellen, dass der Slug eindeutig ist. Führen Sie dann zunächst eine Suche nach der ID basierend auf dem Slug durch und fahren Sie wie zuvor fort.

Was wir jetzt gelernt haben, ist, dass wir eine Umschreiberegel für das Muster "/designers/ gefolgt von irgendetwas bis zum nächsten /" hinzufügen und dieses "irgendetwas" in der Abfragevariable designer_slug. In Ihrem Fall, glaube ich, möchten Sie auch die Seite mit der Schnecke designers als allgemeinen Seiteninhalt verwenden, also werden wir dies auch WordPress mitteilen.

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' );
}

Sie müssen WordPress lediglich anweisen, den designer_slug auch in den Abfragevariablen zu belassen, damit Sie später darauf zugreifen können. WordPress verwendet eine Whitelist mit zulässigen Abfragevariablen, um zu verhindern, dass Benutzer jeden Parameter der Posts-Abfrage über die URL ändern. Alles, was nicht auf dieser Liste steht, wird ignoriert. Einfach in den query_vars hook einbinden und die zusätzliche Variable hinzufügen:

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 , jedoch ohne das Löschen der Regel im Code (damit Sie sie im functions.php Ihres Themas anstelle eines Plugins verwenden können) und mit etwas mehr Sicherheit und Erklärung, weil ich viel über das Umschreiben von Regeln gelernt habe, seit (und weil) ich Ihre erste Frage beantwortet habe.

Chat-Raum Diskussion

Wir haben letzte Probleme für diese Frage geklärt im Chatroom . Am Ende benutzte Steven den Hook generate_rewrite_rules, weil die Funktion add_rewrite_rule() für ihn nicht zu funktionieren schien.

87
Jan Fabry