Benutzerdefinierte Seite mit Variablen in der URL. Schöne URL mit add_rewrite_rule

7

Verwenden von WP3.1

Ich habe eine benutzerdefinierte Seite mit einer WP_Query und die Abfrage erhält dynamische Variablen von der URL. Und ich möchte sichere Variablen und saubere URLs.

Beispiel:

carpage /? carmodel = honda & location = finnland

ZU

carpage / honda / finnland /

Ich habe add_rewrite_rule in functions.php eingefügt und es funktioniert, aber ich bin nicht sicher, ob es sicher ist, dies zu verwenden.

Functions.php

  function fcars() {

  add_rewrite_rule('carpage/[/]?([a-zA-Z-]*)[/]?([a-zA-Z-]*)$', 'index.php?pagename=carpage&var1=$matches[1]&var2=$matches[2]');

  add_rewrite_tag('%var1%', '[a-zA-Z]+');
  add_rewrite_tag('%var2%', '[a-zA-Z]+');
}

add_action('init', 'fcars');

Und in der benutzerdefinierten Vorlage bekomme ich die Vars

Könnte mir bitte jemand dabei helfen. Wie kann ich dies sicher machen und ist dies der richtige Weg in WP3.1?

Was ist in diesem Fall der richtige Weg, um add_rewrite_rule zu erstellen:

carpage / honda / finnland /

(nur Bindestriche und Kleinbuchstaben in der URL) carpage ist die statische Vorlagenseite.

ide79
quelle

Antworten:

16

Ich denke, das add_rewrite_tag()wird nicht benötigt und kann durch direktes Hinzufügen der Variablen zu den öffentlichen Abfragevariablen ersetzt werden:

// Either directly (in your init hook):
$wp->add_query_var( 'var1' );
$wp->add_query_var( 'var2' );

// Or via a filter:
add_filter( 'query_vars', 'wpse12965_query_vars' );
function wpse12965_query_vars( $query_vars )
{
    $query_vars[] = 'var1';
    $query_vars[] = 'var2';
    return $query_vars;
}

Außerdem erlauben Sie derzeit ein oder zwei Schrägstriche vorne, aber keinen hinten. Ich denke, Sie möchten /?das Ende der Regex verschieben. Der [a-zA-Z-]Teil für die Schnecke wird manchmal auch als [^/](alles außer einem Schrägstrich) geschrieben, aber in diesem Fall wird es wahrscheinlich keinen Unterschied machen.

Ich würde die Umschreiberegel so schreiben:

add_action( 'init', 'wpse12065_init' );
function wpse12065_init()
{
    add_rewrite_rule(
        'carpage(/([^/]+))?(/([^/]+))?/?',
        'index.php?pagename=carpage&var1=$matches[2]&var2=$matches[4]',
        'top'
    );
}

Das (/([^/]+))?macht die ganze Gruppe optional, so /carpage, /carpage/hondaund /carpage/honda/finlandsoll funktionieren, mit einem optionalen Schrägstrich am Ende. Weil wir eine zusätzliche Gruppe für die brauchen /, sind die Variablen in der nächsten Capture - Gruppe, so was $matches[1]wird $matches[2]und $matches[2]wird $matches[4].

Wenn Sie Ihre Umschreiberegeln debuggen möchten, empfehle ich mein Rewrite Analyzer-Plugin , mit dem Sie mit der URL spielen und die resultierenden Abfragevariablen anzeigen können.

Jan Fabry
quelle