Die WP Rewrite API: Eine kleine Einführung


URL Rewriting mit WordPress und add_rewrite_rule

WordPress stellt unterschiedliche Schnittstellen (APIs) Plugin- und Theme-Entwicklern zur Verfügung, wobei wir auf dieser Seite einige Funktionen der Rewrite API vorstellen möchten. Zu jede Schnittstelle, die von WordPress zur Verfügung gestellt wird, gehören spezielle Hooks und Funktionen. Darüber hinaus gibt es eine Vielzahl von Hooks (Haken) und Funktionen, deren Einsatz nicht nur auf eine WordPress API beschränkt bleibt. So sind die Beispiele auf dieser Seite nicht nur mit Hilfe der Plugin API realisierbar, sondern könnten bei Bedarf ebenso direkt innerhalb in der functions.php des jeweiligen Themes notiert werden.


Übersicht » WP Rewrite API:


Doch gleich ob als Plugin oder nicht, in beiden Fällen kann eine neue Rewrite Regel mit der WP-Funktion add_rewrite_rule zu den bereits bestehenden Regeln hinzugefügt werden.

Die Funktion add_rewrite_rule

Diese Funktion erwarte drei Argumente in folgender Reihenfolge:

add_rewrite_rule($rule, $rewrite, $position);

$rule – erwartet wird einen String, der den GET-Parametern einer URL entspricht, wobei nach einer Entsprechung mit einem regulären Ausdruck gesucht wird. Bei regulären Ausdrücken handelt es sich um Suchmuster, welche wie eine Schablone nur auf Strings passen, die dem Muster genau entsprechen.
$rewrite – dieses Argument erwartet als Wert ebenfalls einen String, welcher aus einer URL besteht, die bei einem Aufruf ausgelöst werden soll, falls die aufrufende URL auf das Muster der $rule passt. Allein eine Übereinstimmung mit dem regulären Ausdruck garantiert jedoch noch nicht zwangsläufig einen Erfolg. Die auszulösende URL muss WP bekannt sein bzw. $matches darf nicht false (unwahr) liefern.
$position – auch dieses Argument erwartet einen String, wobei praktisch aber nur die beiden Werte “top oder bottom in Frage kommen: Top für oben oder botton für unten, je nachdem ob die neu definierte Regel ganz oben eingefügt und somit vor allen anderen bereits bestehenden Regeln ausgeführt soll, oder aber ganz unten und somit hinter allen anderen Regeln.

Die Funktion add_rewrite_rule wird in Datei rewrite.php definiert, welche sich im Verzeichnis wp-includes befindet.

Die Methode flush_rules

Die Methode flush_rules wird innerhalb der Klasse WP_Rewrite in der Datei rewrite.php, die sich ebenfalls im Verzeichnis wp-includes befindet, definiert.

Der init Haken

Der init-Hook ermöglicht einen Eingriff in die Script-Steuerung zu einem Zeitpunkt, der noch vor dem Senden eines Headers liegt. Laut der Action Reference von WordPress, einsehbar unter codex.wordpress.org/…/init, greift dieser Haken ein, nachdem WordPress fertig geladen wurde, aber noch vor dem Senden irgendwelcher Header. Nur was unter fertiggeladen zu verstehen ist, geht nicht klar aus der Referenz hervor. Was könnte nun darunter zu verstehen sein?

Damit ein Script zur Laufzeit ausgeführt werden kann, müssen alle zur Abarbeitung erforderlichen Dateien mit Funktionen und Klassen geladen werden. Dies geschieht in der Regel durch include und require-Anweisungen oder durch Autoload-Funktionen bei Klassen.
Weiterhin werden innerhalb von Dateien zur Laufzeit eines Scripts zuerst die Funktionen eingelesen, bevor der restliche Code durch den Parser und Interpreter ausgewertet wird. Somit sollte WordPress fertig geladen sein, bevor der Parser einen für Maschinen lesbaren Code erzeugte und der Interpreter eine HTML-Seite, bestehend aus einem HTTP-Header und einem HTTP-Body, für die Auslieferung an den Browser aus diesem Code renderte.

Wie es auch immer sein mag, der init Haken wird mit do_action in der wp-settings.php zu WordPress hinzugefügt.

Praktische Beispiele

Für die nachfolgenden Tests wurden zwei Beiträge erstellt und als Einstellung für Permalinks Beitragsname gewählt.

Titel der Beiträge:

Evergreens aus den 50er Jahren
Evergreens aus den 60er Jahren

Erreichbar unter:

"http://www.example.com/evergreens-aus-den-50er-jahren/"
"http://www.example.com/evergreens-aus-den-60er-jahren/"

Beim ersten Beispiel handelt es sich lediglich um einen Rewrite-Test, bei dem die Regel so gewählt wurde, dass beide Seiten sich nicht nur mit den eigentlichen Permalinks, sondern ebenfalls mit den folgenden URLs verlinken und aufrufen lassen:

"http://www.example.com/oldies/example/evergreens-aus-den-50er-jahren/"
"http://www.example.com/oldies/example/evergreens-aus-den-60er-jahren/"

Die Verwendung der Methode flush_rules, welche in der Klasse WP_Rewrite definiert wird, sorgt dafür, dass alle vorhandenen Regeln neu geschrieben werden, statt die von WP gespeicherten Rules zu laden. Um auf diese Methode zugreifen zu können, muss $wp_rewrite als globale Variable verwendet werden.
In einer zweiten Funktion wird print_r benutzt. Die Funktion dient dazu, um alle vorhandenen Regeln in den Footer zu schreiben. So kann bei Tests überprüft werden, ob die neu definierte Rewrite-Regel richtig zu den bereits vorhandenen hinzugefügt wurde.

Beispiel 1:

<?php
/** -----------------------------------------------------------
 * Plugin Name: Rewrite Test
 * Plugin URI:  http://www.coder-welten.com/die-wp-rewrite-api/
 * Author:      Horst Müller
 * ------------------------------------------------------------
 */

add_action("wp_footer", "zeige_alle_rules_an");
add_action("init", "teste_eine_neue_rewrite_regel");

function teste_eine_neue_rewrite_regel() {

    global $wp_rewrite;
    add_rewrite_rule(

        '^oldies/([a-zA-Z0-9]+?)/([a-zA-Z0-9-]+?)/?$',
        'index.php?name=$matches[2]',
        'top'
        );

    /* -- Nur für die Aktualisierung bei Tests ------------- */

    $wp_rewrite->flush_rules();
}
/* -- Nur für die Anzeige aller Rules im Footer ------------ */

function zeige_alle_rules_an() {

    global $wp_rewrite;
    echo "<pre>\n";
    print_r($wp_rewrite->rules);
    echo "<pre>\n";
}
?>

Die Rewrite-Regel vom zweiten Beispiel ermöglicht es, dass die beiden oben erwähnten Beitragsseiten ebenfalls unter den nachfolgenden Verweisen erreichbar sind:

"http://www.example.com/oldies/evergreens/50er-jahre/"
"http://www.example.com/oldies/evergreens/60er-jahre/"

Die Verwendung von $wp_rewrite als globale Variable ist in diesem Fall nicht erforderlich.

Beispiel 2:

<?php
/** -----------------------------------------------------------
 * Plugin Name: Oldies Evergreens Regel
 * Plugin URI:  http://www.coder-welten.com/die-wp-rewrite-api/
 * Author:      Horst Müller
 * ------------------------------------------------------------
 */

add_action("init", "oldies_evergreens_rewrite_regel");

function oldies_evergreens_rewrite_regel() {

    add_rewrite_rule(

        '^oldies/([a-zA-Z0-9]+?)/([a-zA-Z0-9-]+?)/?$',
        'index.php?name=$matches[1]-aus-den-$matches[2]n',
        'top'
        );
}
?>

Ein weiteres Beispiel und zusätzliche Informationen finden Sie auf der nächsten Seite unter:

QueryStrings und Parameter übergeben und umschreiben

Hinterlasse eine Antwort

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind markiert *