Die Rewrite-API Die Grundlagen

Dies ist der erste Teil einer zweiteiligen Serie, die sich mit der Rewrite-API von WordPress befasst. In diesem Lernprogramm wird erläutert, wie das Umschreiben funktioniert und welche grundlegenden Methoden zum Erstellen benutzerdefinierter Umschreiberegeln verfügbar sind.


Was ist das Umschreiben??

WordPress entscheidet wie alle Content-Management-Systeme, welcher Inhalt basierend auf den an ihn übergebenen Variablen (üblicherweise Abfragevariablen) angezeigt wird. Zum Beispiel: http://example.com/index.php?category=3 sagt WordPress, wir sind nach Beiträgen in einer Kategorie mit der ID 3 und http://example.com/index.php?feed=rss teilt WordPress mit, dass der Feed der Site im RSS-Format vorliegen soll.

Leider kann uns das mit ziemlich hässlichen URLs hinterlassen:

http://example.com/index.php?post_type=portfolio&taxonomy=wordpress&portfolio=my-fancy-plugin

Hier ist das Umschreiben von WordPress. Es erlaubt uns, das obenstehende durch Folgendes zu ersetzen:

http://example.com/portoflio/wordpress/my-fancy-plugin

Das ist jetzt nicht nur viel lesbarer (und einprägsamer), sondern auch SEO-freundlicher. Kurz gesagt, das ist, was Umschreibungen tun.


Wie funktioniert es?

Jetzt http://example.com/portoflio/wordpress/my-fancy-plugin existiert nicht als Verzeichnis oder Datei. Wie liefert WordPress den richtigen Inhalt? Wenn WordPress einen 'hübschen Permalink' wie oben erhält, muss es in etwas umgewandelt werden, das es versteht, nämlich ein Abfrageobjekt. Einfacher muss es die hübsche URL nehmen und die entsprechenden Teile der richtigen Abfragevariable zuordnen. Also für unser Beispiel:

http://example.com/portoflio/wordpress/my-fancy-plugin
  • Post-Typ ist auf 'Portfolio' gesetzt
  • Portfolio-Taxonomie ist auf "WordPress" gesetzt
  • Portfolio ist auf "my-fancy-plugin" (Postname) gesetzt

Dann weiß WordPress, dass wir nach Posts des Typs suchen 'Portfolio', in dem 'WordPress"Portfolio-Taxonomie'Taxonomiebegriff mit Name'my-fancy-plugin'. (Wie Sie vielleicht schon vermutet haben, sind die ersten beiden tatsächlich überflüssig). WordPress führt dann diese Abfrage aus, wählt die entsprechende Vorlage, mit der die Ergebnisse angezeigt werden sollen, und stellt diese dem Betrachter zur Verfügung. Aber WordPress rät nicht nur, wie man die URLs interpretiert, es muss auch gesagt werden ...

Es beginnt mit .htaccess

Vorausgesetzt, Sie können auf der Seite "Einstellungen"> "Permalinks" ziemlich Permalinks aktivieren und aktivieren (siehe Codex für Mindestanforderungen - für WordPress auf Nginx-Servern gibt es dieses Plug-In) - dann fangen die Dinge mit dem an .htaccess Datei. Es spielt eine einfache und doch bedeutende Rolle. WordPress enthält etwas Ähnliches in dieser Datei:

 # BEGINN WordPress  RewriteEngine On RewriteBase / RewriteRule ^ index \ .php $ - [L] RewriteCond% REQUEST_FILENAME! -F RewriteCond% REQUEST_FILENAME! -D RewriteRule. /index.php [L]  # END WordPress

Dies prüft einfach, ob die Datei oder das Verzeichnis tatsächlich existiert - und wenn ja, werden Sie einfach dorthin gebracht. Zum Beispiel:

http://example.com/blog/wp-content/uploads/2012/04/my-picture.png

Ich würde einfach den PNG-Anhang mitnehmen. 'mein bild.png'. Aber wie im Fall von:

http://example.com/blog/portoflio/wordpress/my-fancy-plugin

Wo das Verzeichnis nicht existiert - Sie werden zu Ihrem WordPress weitergeleitet. index.php Datei. Diese Datei startet WordPress.

Interpretation der URL

Zu diesem Zeitpunkt weiß WordPress noch nicht, wonach Sie suchen. Nach dem ersten Laden von WordPress und seinen Einstellungen wird das gestartet parse_request Methode der WP Klasse (befindet sich im class-wp.php Datei). Es ist diese Methode, die das braucht / portoflio / wordpress / my-fancy-plugin und konvertiert es in ein WordPress-verständliches Abfrageobjekt (fast, es setzt tatsächlich die query_vars Array und danach $ wp-> query_posts wandelt das in eine Abfrage um).

Kurz gesagt, diese Funktion vergleicht die empfangene URL (/ portoflio / wordpress / my-fancy-plugin) mit einem Array von "regulären Ausdrücken". Dies ist das Array umschreiben - und es wird ungefähr so ​​aussehen:

 category /(.+?)/ page /? ([0-9] 1,) /? $ => index.php? category_name = $ passt [1] & paged = $ entspricht [2] category / (.+) ?) /? $ => index.php? category_name = $ entspricht [1] tag / ([^ /] +) / page /? ([0-9] 1,) /? $ => index.php ? tag = $ entspricht [1] & paged = $ entspricht [2] tag / ([^ /] +) /? $ => index.php? tag = $ entspricht [1] ([0-9] 4) / ([0-9] 1,2) / ([0-9] 1,2) /? $ => Index.php? Year = $ entspricht [1] & monthnum = $ entspricht [2] & day = $ entspricht [3] (. +?) (/ [0-9] +)? /? $ => index.php? Seitenname = $ entspricht [1] & page = $ passt [2]

Die Schlüssel dieses Arrays sind reguläre Ausdrücke, und die empfangene URL wird nacheinander verglichen, bis eine Übereinstimmung mit dem Muster der empfangenen URL besteht. Der entsprechende Wert ist, wie die URL dann interpretiert wird. Das $ entspricht Array enthält die erfassten Werte (von 1 indiziert) aus dem Abgleich.

Zum Beispiel besuchen www.example.com/blog/tag/my-tag, WordPress sucht nach dem ersten passenden Muster 'tag / mein-tag'. Mit dem obigen Array stimmt es mit dem dritten Muster überein: tag / ([^ /] +) /? $. Dies weist WordPress an, die URL als zu interpretieren www.example.com/blog/index.php?tag=my-tag und entsprechend die 'mein tagArchiv wird serviert.

Natürlich können Sie in WordPress dieses Array anpassen, und der Rest dieses Tutorials zeigt Ihnen, wie das geht.


Anpassen der Rewrite-Regeln

Einstellungen -> Permalinks

Ihre erste Anlaufstelle sollte die Einstellungsseite "Permalink" sein. Auf dieser Seite können Sie die Regeln für die Standardeinstellung ändern.Post'post type und'Kategorie' und 'StichworteTaxonomien. Die 'default' Option hat ziemlich Permalinks deaktiviert, aber Sie können aus einer Liste voreingestellter Strukturen auswählen oder eine benutzerdefinierte Struktur erstellen. Bitte beachten Sie, dass benutzerdefinierte Strukturen nicht die URL Ihrer Website enthalten dürfen. In WordPress können Sie Ihre Permalink-Struktur ändern, indem Sie die bereitgestellten Tags hinzufügen, wie z %Anschriftname% (der Name der Post), %Jahr% (das Jahr, in dem der Beitrag veröffentlicht wurde) und %Autor% (der Autor der Post). Eine Permalink-Struktur wie:

/% year% /% author% /% postname% /

Erzeugt einen Postlink wie:

www.example.com/2012/stephen/my-post

Die Dokumentation zu diesen Optionen finden Sie im WordPress-Codex. (Später zeige ich Ihnen, wie Sie Ihre eigenen benutzerdefinierten Tags erstellen.).

Die angebotenen Optionen sind jedoch recht begrenzt. In diesem Tutorial werde ich mich auf die von WordPress bereitgestellten Funktionen konzentrieren, die eine bessere Kontrolle über Permalink-Strukturen und deren Interpretation bieten. Ich werde nicht auf die Umschreibungsoptionen eingehen, die für benutzerdefinierte Beitragstypen oder Taxonomien verfügbar sind, da dies in Teil 2 behandelt wird.

Warum die Regeln zum Überschreiben überschreiben??

Nach einer Änderung der Umschreiberegeln (z. B. mithilfe einer der folgenden Methoden oder Registrieren eines benutzerdefinierten Beitragstyps oder einer Taxonomie) stellen Sie möglicherweise fest, dass die neuen Regeln nicht wirksam werden. Das liegt daran, dass Sie die Regeln zum Umschreiben leeren müssen. Dies kann auf zwei Arten erfolgen:

  • Besuchen Sie einfach die Seite Einstellungen -> Permalink
  • Anruf flush_rewrite_rules () (in Teil 2 behandelt)

Was macht das? Erinnern Sie sich daran, dass die parse_request Die Methode vergleicht die Anforderung mit einem Umschreibungsarray. Dieses Array befindet sich in der Datenbank. Durch das Löschen der Überschreibungsregeln wird die Datenbank entsprechend Ihren Änderungen aktualisiert. Bis sie dies tun, werden sie nicht erkannt. Aber parse_request ebenfalls schreibt an die .htaccess Datei. Dies macht es zu einem teuren Vorgang. Also, obwohl ich die Verwendung von nicht abdecken werde flush_rewrite_rules () Bis zum zweiten Teil gebe ich Ihnen folgende Warnung: Ruf nicht an Flush_rewrite_rules auf jeder Seite laden. Plug-Ins sollten dies nur aufrufen, wenn das Plug-In aktiviert und deaktiviert ist.

Rewrite-Regel hinzufügen

Das add_rewrite_rule ermöglicht das Hinzufügen zusätzlicher Regeln zum Umschreibungsarray. Diese Funktion akzeptiert drei Argumente:

  • Regel - ein regulärer Ausdruck, mit dem die Anforderungs-URL verglichen werden soll
  • umschreiben - Die Abfragezeichenfolge, die zur Interpretation der Regel verwendet wird. Das $ entspricht Array enthält die erfassten Übereinstimmungen und beginnt mit dem Index '1'.
  • Position - 'oben' oder 'Unterseite'. Wo soll die Regel platziert werden: Oben im Umschreibungsarray oder unten. WordPress scannt vom oberen Rand des Arrays nach unten und stoppt, sobald eine Übereinstimmung gefunden wird. Damit Ihre Regeln Vorrang vor vorhandenen Regeln haben, sollten Sie dies auf '' setzen.oben'. Standardeinstellung ist 'Unterseite'.

Hinweis: wenn du benutzt add_rewrite_rule mehrmals, jeweils mit Position 'oben' - das zuerst Anruf hat Vorrang vor nachfolgenden Aufrufen.

Nehmen wir an, unsere Posts haben ein Ereignisdatum und wir möchten diese Struktur haben: www.example.com/blog/the-olympics-begin/2012-07-27 Interpretiert als www.example.com/blog/index.php?postname=the-olympics-begin&eventdate=2012-07-27 dann können wir diese Regel wie folgt hinzufügen:

 Funktion wptuts_add_rewrite_rules () add_rewrite_rule ('^ ([^ /] *) / ([0-9] 4 - [0-9] 2 - [0-9] 2) /? $' / / String gefolgt von einem Schrägstrich, gefolgt von einem Datum in der Form '2012-04-21', gefolgt von einem weiteren Schrägstrich 'index.php? Pagename = $ match [1] & eventdate = $ matches [2]', 'top' );  add_action ('init', 'wptuts_add_rewrite_rules');

Folgendes würde interpretieren www.example.com/olympics/2012/rowing wie www.example.com/index.php?p=17&olymyear=2012&game=rowing

 add_rewrite_rule ('^ olympics / ([0-9] 4) / ([^ /] *)', 'index.php? p = 17 & olymyear = $ match [1] & game = $ match [2]', ' oben' );

Wenn Sie sich Ihrer regulären Ausdrücke nicht sicher sind, finden Sie diese Einführung und dieses Tool möglicherweise hilfreich.

Rewrite-Tag hinzufügen

Sie denken vielleicht, dass der Wert von Veranstaltungsdatum (2012-07-27 im obigen Beispiel), olymyear und Spiel ist möglicherweise über die WordPress-Interna über die get_query_var (auf die gleiche Weise das get_query_var ('paged') erhält die Seitennummer, auf der Sie sich gerade befinden). WordPress erkennt die Variable jedoch nicht automatisch Veranstaltungsdatum obwohl es als GET-Variable interpretiert wird. Es gibt verschiedene Möglichkeiten, WordPress benutzerdefinierte Variablen erkennen zu lassen. Eine ist die Verwendung der query_vars filtern, wie im Abschnitt "Benutzerdefinierten Endpunkt hinzufügen" beschrieben. Alternativ können wir noch einen Schritt weiter gehen und verwenden add_rewrite_tag um ein benutzerdefiniertes Tag wie das Standard zu registrieren %Anschriftname% und %Jahr%

Diese Funktion akzeptiert drei Argumente:

  • Verlinke den Namen - (mit führenden und nachlaufenden%) z. %Veranstaltungsdatum%
  • Regex - Regulärer Ausdruck, um den Wert zu überprüfen, z. '([0-9] 4 - [0-9] 2 - [0-9] 2)'
  • Abfrage - (optional) Wie das Tag interpretiert wird, z. 'eventdate ='. Wenn angegeben, muss mit einem '=' enden.
 Funktion wptuts_register_rewrite_tag () add_rewrite_tag ('% eventdate%', '([0-9] 4 - [0-9] 2 - [0-9] 2)');  add_action ('init', 'wptuts_register_rewrite_tag');

Nicht nur wird get_query_var ('eventdate') Gibt den Wert des Datums in der URL zurück. Sie können das Tag jedoch verwenden %Veranstaltungsdatum% in den Einstellungen -> Permalink (zusammen mit der Standardeinstellung) %Jahr%, %Anschriftname% usw.) und WordPress wird es richtig interpretieren. Unglücklicherweise Beim Erstellen eines Permalinks für einen Beitrag weiß WordPress nicht, wie es ersetzt werden soll %Veranstaltungsdatum% mit dem passenden Wert: so enden unsere Post-Permalinks wie folgt:

www.example.com/the-olympics-begin/%eventdate%

Wir müssen ersetzen %Veranstaltungsdatum% mit einem geeigneten Wert, und wir können dies mit der post_link Filter. (In diesem Beispiel gehe ich davon aus, dass der Wert in einem benutzerdefinierten Feld gespeichert ist.)Veranstaltungsdatum').

 Funktion wp_tuts_filter_post_link ($ permalink, $ post) // Prüfen Sie, ob der Tag% eventdate% in der URL vorhanden ist: if (false === strpos ($ permalink, '% eventdate%')) return $ permalink; // Das in post meta gespeicherte Ereignisdatum abrufen $ event_date = get_post_meta ($ post-> ID, 'eventdate', true); // Wenn kein Datum gefunden wird, müssen wir leider einen 'Standardwert' angeben. $ event_date = (! leer ($ event_date)? $ event_date: '2012-01-01'); $ event_date = urlencode ($ event_date); // '% eventdate%' ersetzen $ permalink = str_replace ('% eventdate%', $ event_date, $ permalink); return $ permalink;  add_filter ('post_link', 'wp_tuts_filter_post_link', 10, 2);

In Teil 2 dieser Serie werde ich benutzerdefinierte Tags für benutzerdefinierte Beitragstypen behandeln.

Benutzerdefinierten Endpunkt hinzufügen

Endpunkte sind Tags, die an die URL angehängt werden (/ trackback / [wert] ist das häufigste). Es gibt mehrere mögliche Einsatzmöglichkeiten: Anzeigen verschiedener Vorlagen je nach Wertesatz, benutzerdefinierten Benachrichtigungen und Anzeigen von Posts in verschiedenen "Formaten" (druckbar, XML, JSON usw.).

Sie können Endpunkte mit erstellen add_rewrite_endpoint. Diese Funktion akzeptiert zwei Argumente:

  • Name - Der Name des Endpunkts, z. 'Json','bilden', usw.
  • woher - Endpunktmaske, die angibt, wo der Endpunkt hinzugefügt werden soll. Dies sollte eine der unten aufgelisteten EP_ * -Konstanten sein (oder eine Kombination mit bitweisen Operatoren). Wenn Sie benutzerdefinierte Beitragstypen registrieren, können Sie eine Maske für diesen Beitragstyp erstellen:

Die Standardendpunktmasken sind:

  • EP_PERMALINK - für Post Permalinks
  • EP_ATTACHMENT - für Anhänge
  • EP_DATE - für Datumsarchive
  • EP_YEAR - für Jahresarchive
  • EP_MONTH - für Monatsarchive
  • EP_DAY - für Tagesarchive
  • EP_ROOT - für die Wurzel der Site
  • EP_COMMENTS - für Kommentare
  • EP_SEARCH - für Suchen
  • EP_CATEGORIES - für Kategorien
  • EP_TAGS - für Tags
  • EP_AUTHORS - für das Archiv der Beiträge des Autors
  • EP_PAGES - für Seiten
  • EP_ALL - für alles

Endpunkte sind äußerst flexibel. Sie können sie mit bitweisen Operatoren verwenden, sodass Sie beispielsweise Endpunkte hinzufügen können, mit denen Sie Post- und Seitenpermalinks erstellen können EP_PERMALINK | EP_PAGES.

 Funktion wptuts_add_endpoints () add_rewrite_endpoint ('myendpoint', EP_PERMALINK); // fügt Endpunkte zu Permalinks hinzu add_rewrite_endpoint ('anotherendpoint', EP_AUTHORS | EP_SEARCH); // Fügt Endpunkten URLs für Autoren oder Suchergebnisse hinzu. Add_action ('init', 'wptuts_add_endpoints');

Als kurzes Beispiel können Endpunkte für Formularübergaben hilfreich sein. Angenommen, wir haben eine Kontaktformularseite mit Namen Kontakt Formular und mit permalink: www.example.com/kontakt und will die URLs:

  • www.example.com/contact/submission/success - eine erfolgreiche Formulareinreichung widerspiegeln
  • www.example.com/contact/submission/error - eine erfolglose Formulareinreichung widerspiegeln

Dies kann mit Endpunkten erfolgen. Im Folgenden finden Sie ein sehr einfaches Beispiel für die Verwendung von Endpunkten. Daher ist das Formular in seinen Prüfungen unglaublich einfach (und macht eigentlich nichts mit den Daten). Normalerweise funktioniert ein solches Formular am besten in einem Plug-In mit Shortcodes. Erstellen Sie für die Zwecke dieses Beispiels jedoch eine Seite mit der folgenden Vorlage und dem restlichen Code, den Sie in Ihre einfügen können Functions.php

 

Mein einfaches Kontaktformular

Ihre Nachricht wurde gesendet!
Hoppla! Es scheint einen Fehler gegeben zu haben ...

(Falls Sie sich fragen, bezieht sich der Honig auf diese sehr grundlegende Methode, um Spam zu behandeln, die hier beschrieben wird. Dies ist sicherlich kein Narrenbeweis, aber die ordnungsgemäße Verarbeitung von Formularen und Spamschutz ist hier kein Thema). Jetzt erstellen wir unseren Endpunkt:

 Funktion wptuts_add_endpoint () add_rewrite_endpoint ('form', EP_PAGES);  add_action ('init', 'wptuts_add_endpoint');

Als nächstes fügen wir unsere 'bilden'Variable zum Array der erkannten Variablen:

 Funktion wptuts_add_queryvars ($ query_vars) $ query_vars [] = 'form'; Rückgabe von $ query_vars;  add_filter ('query_vars', 'wptuts_add_queryvars');

Schließlich stellen wir einen Formularhandler bereit, der die Daten verarbeitet, das Formular sendet und dann mit dem entsprechenden Endpunktwert auf die Kontaktseite umleitet.

 function wptuts_form_handler () // Wollen wir das Formular verarbeiten, wenn (! isset ($ _POST ['action']) || 'wptuts_send_message'! = $ _POST ['action'] zurückkehren; // ID der Kontaktformularseite $ form_id = 2163; $ redirect = get_permalink ($ form_id); // Nonces prüfen $ data = $ _POST ['wptuts_contact']; if (! isset ($ _ POST ['wptuts_contact_nonce']) ||! wp_verify_nonce ($ _ POST ['wptuts_contact_nonce'], 'wptuts_send_message')) wp_redirect ($ redirect); Ausfahrt();  if (! empty ($ data ['Confirmation'])) // Bienen im Schatz… $ umleiten. = 'form / error'; wp_redirect ($ redirect); Ausfahrt();  // Daten erstellen und validieren usw. // Dann machen Sie tatsächlich etwas mit den bereinigten Daten // Erfolgreich! $ redirect. = 'form / success'; wp_redirect ($ redirect); Ausfahrt();  add_action ('init', 'wptuts_form_handler');

Selbstverständlich könnte auch dieses Beispiel durch die Bereitstellung detaillierter Fehlermeldungen, die den Grund des Fehlers angeben, erheblich verbessert werden.

Einen benutzerdefinierten Feed hinzufügen

Mit aktivierten Permalinks werden in WordPress automatisch hübsche URLs für den Feed Ihrer Website erstellt: www.example.com/feed/rss. Das add_feed Mit dieser Funktion können Sie einen benutzerdefinierten Feed erstellen, der bei Aktivierung von Permalinks auch eine "hübsche" URL enthält. Diese Funktion akzeptiert zwei Argumente:

  • Name des Feeds - Der Name des Feeds wird in angezeigt Feed / [Feedname]
  • Rückruf einleiten - Die Funktion, die für die Anzeige des Feed-Inhalts verantwortlich ist.

Das Folgende ist als Beispiel für gedacht add_feed, und bietet einen sehr einfachen benutzerdefinierten Feed.

 Funktion wptuts_events_feed_callback () $ custom_feed = new WP_Query (array ('meta_key' => 'eventdate')); header ('Content-Type:'. feed_content_type ('rss-http'). '; charset = ". get_option (" blog_charset'), true); Echo ''; ?>   Mein eigener Feed     have_posts ()):?> have_posts ()): $ custom_feed-> the_post (); ?>  <?php the_title_rss() ?>    ]]>       

Nach dem Spülen der Permalinks steht der Feed unter zur Verfügung www.example.com/feed/events.


Überprüfen der Rewrite-Regeln

Wenn Sie einige Ihrer eigenen Umschreibungsregeln hinzugefügt haben (und sie gelöscht haben), möchten Sie wahrscheinlich überprüfen, ob sie ordnungsgemäß funktionieren. Wenn dies nicht der Fall ist, finden Sie heraus, was falsch läuft. Dafür empfehle ich das Monkeyman Rewrite Analyzer-Plug-In, ein kostenloses Plug-In, das im WordPress-Repository verfügbar ist. Nach der Aktivierung fügt dieses Plug-In dem Abschnitt "Tools" eine Seite hinzu, auf der alle Regeln zum Umschreiben aufgeführt sind.

Sie können die Regeln auch testen, indem Sie eine Beispiel-URL angeben. Das Plug-in filtert die Regeln, sodass nur übereinstimmende Muster angezeigt werden und gibt an, wie WordPress die URL interpretiert.

Viel Spaß und halte Ausschau nach Teil 2, der demnächst erscheint!

Bitte beachten Sie: In unserem Syntax-Highlighter befindet sich derzeit ein Fehler, der Folgendes anzeigt:leeren()" wie "emptyempty ()Vergessen Sie nicht, Ihren Code entsprechend anzupassen.