Wie erstelle ich benutzerdefinierte URL-Routen?

50

Ich habe eine sehr eigenartige Anforderung, hoffentlich kann ich sie erklären, ohne zu verwirrend zu sein. Ich habe eine Seitenvorlage erstellt, in der einige Eigenschaften aufgelistet sind, die ich aus einer externen XML-Datei erhalte. Bisher keine Probleme. Nehmen wir an, die URL sieht folgendermaßen aus:

http://www.example.com/properties/

Jede Eigenschaft verfügt über einen Link, der den Benutzer auf eine Seite "Einzelne Eigenschaft" umleiten soll, auf der weitere Informationen dazu angezeigt werden. Ich habe mich gefragt, ob es einen Weg gibt, den Link so zu gestalten:

http://www.example.com/properties/123

Wo 123wäre die ID des Eigentums. Wenn ich also die URL habe, die properties/some_idmir gefällt, möchte ich in der Lage sein, eine Ansichtsdatei (wie die single.phpoder page.php-Dateien) zu laden, die jedoch für diese URL-Bedingung spezifisch ist.

Ist das möglich?

Javier Villanueva
quelle

Antworten:

57

Füge dies der functions.php deines Themes hinzu oder stecke es in ein Plugin .

add_action( 'init', 'wpse26388_rewrites_init' );
function wpse26388_rewrites_init(){
    add_rewrite_rule(
        'properties/([0-9]+)/?$',
        'index.php?pagename=properties&property_id=$matches[1]',
        'top' );
}

add_filter( 'query_vars', 'wpse26388_query_vars' );
function wpse26388_query_vars( $query_vars ){
    $query_vars[] = 'property_id';
    return $query_vars;
}

Dies fügt eine Umschreiberegel hinzu, die Anfragen /properties/mit einer beliebigen Kombination von Zahlen, die dem Seitennamen folgen properties, mit property_idgesetztem Abfrage-Var weiterleitet . Besuchen Sie auf jeden Fall die Seite mit den Einstellungen für Permalinks und speichern Sie sie, um die Überschreibregeln zu löschen, damit diese neue Regel enthalten ist.

Gibt in Ihrer page-properties.phpVorlage get_query_var('property_id')die Eigenschafts-ID zurück, wenn diese festgelegt wurde. Wenn dies nicht der Fall ist, wird die Seite mit den Standardeigenschaften angezeigt.

Milo
quelle
4
Dies war nahe daran, für mich zu arbeiten, aber ich musste hinzufügen: add_filter ('init', 'flushRules'); Funktion flushRules () {global $ wp_rewrite; $ wp_rewrite-> flush_rules (); }
tooshel
19
@tooshel Sie möchten definitiv nicht bei jeder Anfrage die Regeln löschen. Dies ist eine teure Operation und verlangsamt das Crawling Ihrer Website. Sie müssen die Regeln nur einmal löschen, wenn Sie das Plugin aktivieren oder einfach die Seite mit den Einstellungen für Permalinks besuchen.
Milo
Ja, das verstehe ich. . . aber wenn Sie testen, ist es schön, dass es da drin ist!
Tooshel
3
Ein intelligenteres Umschreiben von URL-Regexp könnte sein ^properties/([0-9]+)/?. Andernfalls würde es so etwas wie passenexample/properties/1
Ryan Taylor
@ RyanTaylor bist du dir da sicher? es erfasst nicht, example/properties/1wenn ich es teste.
Milo
9

Ein anderer Weg, es zu tun:

add_action('init', function() {
    add_rewrite_rule( '^properties/([0-9]+)/?',
                      'index.php?pagename=properties&property_id=$matches[1]',
                      'top' );
}, 10, 0);

add_action('init', function() {
    add_rewrite_tag( '%property_id%', '([^&]+)' );
}, 10, 0);

Codex Rewrite API / Schreibregel hinzufügen

Codex Rewrite API / Add Rewrite Tag

Christian Lescuyer
quelle
2
Die akzeptierte Antwort funktioniert mit 4,7 (und 4,8), nicht sicher, warum Sie denken, dass dies nicht der Fall ist. Ihr Code tut im Wesentlichen das Gleiche und add_rewrite_tagfügt die Abfragevariable demselben Array wie der query_varsFilter hinzu.
Milo
@Milo es hat bei mir wahrscheinlich nicht funktioniert, aber ich habe kein 4.7-Handy mehr und kann es nicht überprüfen. Ich werde meine Antwort bearbeiten.
Christian Lescuyer
@Milo Ich persönlich bevorzuge zwar das Umschreiben von Tags, habe aber trotzdem die akzeptierte Antwort getestet und es funktioniert. Nur ein paar persönliche Vorlieben.
Jack Johansson
1
@JackJohansson-Umschreibetags sind erforderlich, wenn Sie sie in einer Permastruktur verwenden . Es ist nur eine zusätzliche Datenmenge, die WordPress in diesem Fall niemals verwendet.
Milo
Beide Regeln können zur selben Methode hinzugefügt werden, was zu einer saubereren und nützlicheren Funktion führt, um herauszufinden, ob Wartungsarbeiten durchgeführt werden
Uhr