Die Rewrite-API Post-Typen und Taxonomien

Dies ist Teil zwei einer Serie, die sich mit der Rewrite-API von WordPress befasst. Im ersten Teil haben wir eine Pfeifenstopp-Tour durch die Grundlagen der Rewrite-API von WordPress gemacht. In diesem Tutorial werden wir uns die Einstellungen für das Umschreiben ansehen, die uns zur Verfügung stehen, wenn Sie einen Beitragstyp oder eine Taxonomie registrieren. Während benutzerdefinierte Posttypen und Taxonomien (im Gegensatz zu den Standardposts, Kategorien und Tags) nicht von Einstellungen -> Permalink-Benutzeroberfläche profitieren, ist das Einrichten von Überschreibungen für benutzerdefinierte Typen immer noch recht unkompliziert. Wir werden auch die im ersten Teil eingeführten Methoden verwenden. Wenn Sie dies noch nicht getan haben, empfehle ich Ihnen, die Rewrite-API von Teil 1: Grundlagen zu lesen.


Flushing der Rewrite-Regeln

Wenn Sie einen benutzerdefinierten Typ registrieren, registriert WordPress auch Regeln zum Umschreiben (eigentlich, nicht ganz, und ich erkläre warum im Abschnitt "Permastrukturen". Wie bereits in Teil 1 erwähnt, werden diese Regeln nur aufgenommen, wenn die Umschreiberegeln "geleert" werden. Themes und Plug-Ins können dieses 'Flushing' durch Aufruf erzwingen flush_rewrite_rules (). Dies muss und sollte nur einmal bei der Aktivierung und dann bei der Deaktivierung erfolgen (zum Aufräumen nach dem Aufräumen).

Bevor Sie die Regeln zum Umschreiben leeren, müssen Sie sie natürlich hinzugefügt haben. Jedoch die drin Wenn Sie festlegen möchten, welche Beitragstypen registriert werden sollen, wurde bereits gefeuert, und als dies der Fall war, war Ihr Plug-In oder Thema noch nicht aktiv, sodass Ihre Beitragstypen und Taxonomien noch nicht registriert sind. Um die mit Ihren Beitragstypen und Taxonomien gelieferten Umschreiberegeln zu registrieren, müssen Sie sie bei der Aktivierung manuell registrieren, bevor Sie die Umschreiberegel leeren. Also sollte dies Ihr Aufbau sein:

 function wptuts_register_types () // Funktion, die Ihren benutzerdefinierten Beitragstyp und Ihre Taxonomien registriert add_action ('init', 'wptuts_register_types'); function wptuts_plugin_activation () // Registrieren Sie Typen, um die Umschreiberegeln zu registrieren. wptuts_register_types (); // dann spülen sie flush_rewrite_rules ();  register_activation_hook (__FILE__, 'wptuts_plugin_activation'); Funktion wptuts_plugin_deactivation () flush_rewrite_rules ();  register_activation_hook (__FILE__, 'wptuts_plugin_activation');

Themen können die Haken verwenden after_switch_theme zur Aktivierung und switch_theme zur Deaktivierung.


Benutzerdefinierte Beitragstypen

Wenn Sie einen Beitragstyp mit registrieren register_post_type Eines der verfügbaren Argumente ist das Umschreibungsargument. Dies sollte ein Array mit den folgenden Schlüsseln sein:

  • Schnecke - ein Slug, mit dem der Beitragstyp in URLs identifiziert wird. Der Posten des Postens wird hieran angehängt, um die Post des Postens zu erhalten, z. www.example.com/Bücher/der Zauberer von Oz
  • mit_front - richtig oder falsch. Wenn die Permalink-Struktur Ihres Beitrags mit einer konstanten Basis beginnt, z. B. "/ blog" - kann dies auch zur Permalink-Struktur Ihres benutzerdefinierten Posttyps hinzugefügt werden, indem Sie ihn auf true setzen, z. wahr wird geben www.example.com/blog/books/ und falsch www.example.com/books/
  • Einspeisungen - richtig oder falsch. Ob Feed-Überschreibregeln erzeugt werden sollen, z. www.example.com/books/feed/rss und www.example.com/book/rss. Der Standardwert ist der Wert von has_archive.
  • Seiten - richtig oder falsch. Ob eine Regel für eine "hübsche" Paginierung für das Archiv des Nachtyps erzeugt werden soll, z. www.example.com/books/page/2 anstatt www.example.com/books?page=2. Der Standardwert ist "true".
  • ep_mask - Dies war früher ein separates Argument: permalink_epmask. Ab 3.4 wird es in das Umschreibungsfeld verschoben. Der Standardwert ist EP_PERMALINK.

Die Tasten "Feeds" und "Pages" beziehen sich nur auf die Archivseite des Post-Typs (für die Sie die festlegen müssen.) has_archive Argument auf wahr). Von diesem Umschreibungsarray aus übernimmt WordPress die Generierung der Umschreiberegeln für Ihre Beitragstypen automatisch. Als Beispiel:

 $ labels = array ('name' => __ ('Books', 'your-plugins-translation-domain'), // Array von Labels); $ args = array ('labels' => $ labels, 'has_archive' => true, 'umschreiben' => array ('slug' => 'books', 'with_front' => false, 'feed' => true, 'pages' => true)); register_post_type ('book', $ args);

Würde die folgenden Regeln zum Umschreiben geben:

  • Der Permalink des Buches 'der Zauberer von Oz': www.example.com/books/the-wizard-of-oz
  • Archiv aller Bücher www.example.com/books (und www.example.com/books/page/2)
  • Der Feed des obigen Archivs: www.example.com/books/feed/rss (und www.example.com/books/rss)

Taxonomien

Das register_taxonomy () Funktion bietet weniger Optionen:

  • Schnecke - ein Slug zum Identifizieren der Taxonomie, z. www.example.com/Genre/Geschichte
  • mit_front - Wie oben.
  • hierarchisch - richtig oder falsch. Wenn true festgelegt ist und die Taxonomie hierarchisch ist, spiegelt der Begriff Permalink die Hierarchie wider. Der Standardwert ist "false".
  • ep_mask - Hinzugefügt in 3.4. Siehe den Abschnitt "EP-Maske".

Die ersten beiden Optionen sind ähnlich wie oben. Die hierarchische Option gibt dem Begriff Permalinks die gleiche Struktur wie Seiten. Lassen Sie beispielsweise "History" ein Genre und "Military History" ein Unter-Genre sein. Wenn die Hierarchie auf "false" gesetzt ist, hat 'Military History' den Permalink:

 www.example.com/genre/military-history

Wenn dies auf true gesetzt ist, wird es Folgendes haben:

 www.example.com/genre/military/military-history

Durch das Registrieren einer Taxonomie werden die Feeds Ihrer Taxonomie-Begriffe automatisch registriert:

 www.example.com/genre/military-history/feed

Sie können den Feed-Link-Permalink zu jedem Taxonomiebegriff mit erhalten $ feed_link = get_term_feed_link ($ term_id, $ taxonomy, $ feed)


Beitragstyp-Archiv

Standardmäßig erzeugt WordPress keine "hübschen" Permalinks für das Jahr, den Monat oder den Tag Ihres benutzerdefinierten Beitragstyps (auch nicht für das Autorenarchiv - aber wir lassen diese vorerst). Während:

 www.example.com/?post_type=book&year=2012&monthnum=05

Gibt korrekt ein Archiv aller im Mai 2012 veröffentlichten Bücher ab:

 www.example.com/books/2012/05

Gibt einen 404-Fehler aus. Wir können jedoch einfach zusätzliche Umschreibungsregeln hinzufügen, indem Sie die verfügbaren Umschreibungs-API-Methoden verwenden, die wir in Teil 1 behandelt haben. Eine Methode besteht darin, die folgende Liste der Umschreiberegeln hinzuzufügen, wenn Sie Ihren Beitragstyp registrieren:

 // Tagesarchiv hinzufügen (und Paginierung) add_rewrite_rule ("books / ([0-9] 4) / ([0-9] 2) / ([0-9] 2) / page /? ([0-9] 1,) /? ", 'Index.php? Post_type = Buch & Jahr = $ Matches [1] & monthnum = $ Matches [2] & Tag = $ Matches [3] & paged = $ Matches [4] ','oben'); add_rewrite_rule ("books / ([0-9] 4) / ([0-9] 2) / ([0-9] 2) /?", 'index.php? post_type = book & year = $ Matches [1] & monthnum = $ Matches [2] & Tag = $ Matches [3] ',' top '); // Monatsarchiv (und Seitenumbruch) hinzufügen add_rewrite_rule ("books / ([0-9] 4) / ([0-9] 2) / page /? ([0-9] 1,) /?",'index.php?post_type=book&year=$matches[1 <&monthnum=$matches[2?&paged=$matches[3 ?,'top '); add_rewrite_rule ("books / ([0-9] 4) / ([0-9] 2) /?", 'index.php? post_type = book & year = $ passt [1] & monthnum = $ passt [2 ]','oben'); // Jahresarchiv (und Seitenumbruch) hinzufügen add_rewrite_rule ("books / ([0-9] 4) / page /? ([0-9] 1,) /?", 'Index.php? Post_type = Buch & Jahr = $ Matches [1] & paged = $ Matches [2] ',' top '); add_rewrite_rule ("books / ([0-9] 4) /?", 'index.php? post_type = book & year = $ match [1]', 'top');

Dies kann leicht unübersichtlich werden - vor allem, wenn Sie der Meinung sind, dass Sie zusätzliche Regeln hinzufügen müssen, wenn Ihre Archive hübsche URLs für ihre Feeds unterstützen sollen. Das Obige veranschaulicht jedoch eine wichtige Tatsache beim Hinzufügen benutzerdefinierter Regeln: Die Reihenfolge, in der die Regeln hinzugefügt werden, ist wichtig.

Erinnern Sie sich daran, dass diese Regeln in der Reihenfolge, in der Sie den Aufruf ausführen, zum Umschreibungsarray hinzugefügt werden add_rewrite_rule. Beim Analysieren einer Anfrage verwendet WordPress die zuerst übereinstimmende Regel. Wechseln Sie die Reihenfolge, in der die Archivregeln für Jahr und Monat hinzugefügt werden. Das wirst du finden www.example.com/books/2012/04/ bringt Sie zum Archiv 2012. Dies liegt daran, dass die URL mit den Mustern für das Jahres- und Monatsarchiv übereinstimmt. Das erste wurde jedoch zuerst hinzugefügt. Denken Sie daran, immer zuerst die spezifischere Regel hinzuzufügen.

Wenn Sie dagegen eine Umschreibungsregel hinzufügen, deren Regex in der Regel bereits vorhanden ist, wird diese Regel durch die neue überschrieben.


Permastrukturen

Es gibt einen einfachen Weg, um das oben genannte zu erreichen: add_permastruct. Diese Funktion wird von WordPress verwendet, um 'Permastrukturen' zu erstellen, aus denen Regeln (wie oben beschrieben) erstellt werden, die Seitenumbrüche und Feeds behandeln. Wenn Sie einen benutzerdefinierten Beitragstyp registrieren, erstellt WordPress nicht automatisch alle Umschreiberegeln. Stattdessen registriert es eine Permastruktur. Nur wenn die Regeln generiert werden (d. H. Wenn sie geleert werden), verwendet WordPress diese Permastrukturen, um die eigentlichen Umschreibregeln zu generieren.

Ein Beispiel für eine Permastruktur ist diejenige, die Sie in Einstellungen -> Permalinks verwenden. Diese akzeptieren alle 'fest codierten' Slugs oder alle Tags, die standardmäßig vorhanden sind oder mit hinzugefügt wurden add_rewrite_tag, die wir im ersten Teil behandelt haben. Zum Beispiel die Permastruktur % year% /% category% /% author% würde die folgenden Umschreibungsregeln generieren:

  • www.example.com/2012/url-rewriting/stephen
  • www.example.com/2012/url-rewriting/stephen/page/2
  • www.example.com/2012/url-rewriting/stephen/feed/rss
  • www.example.com/2012/url-rewriting/
  • www.example.com/2012/url-rewriting/page/2
  • www.example.com/2012/url-rewriting/feed/rss
  • www.example.com/2012/
  • www.example.com/2012/page/2
  • www.example.com/2012/feed/rss

Das add_permastruct Funktion

Das add_permastruct Funktion akzeptiert vier Argumente:

  • Name - Ein einzigartiger Slug, um Ihre Permastruktur zu identifizieren
  • struct - Die Permastruktur selbst, z.B. '% year% /% category% /% author%'
  • mit_front - richtig oder falsch. Dies ist das gleiche Argument wie bei der Registrierung des Beitragstyps
  • ep_mask - Siehe den Abschnitt "EP-Maske"

Ein paar Warnungen zur Verwendung add_permastruct müssen hier gemacht werden. Erstens: Sie sollten sicherstellen, dass eine benutzerdefinierte Permastruktur nicht mit den Wordwresche-Umschreiberegeln für Posts und Seiten kollidiert. Dies kann geschehen, indem Sie Ihrer benutzerdefinierten Permastruktur etwas Hardcodiertes voranstellen. Zum Beispiel:

 "etwas hartcodiert /% year% /% monthnum% /% day%"

Zweitens: Die Regeln werden in dieser Reihenfolge hinzugefügt. Wenn Ihre Tags "zu generisch" sind, werden die letzteren Regeln möglicherweise nie angewendet. Beispielsweise funktioniert die obige Struktur (die Sie auf der Seite Einstellungen -> Permalinks ausprobieren können) im Allgemeinen gut, mit Ausnahme der folgenden:

 www.example.com/2012/page/2

Wird als Seite der Beiträge von Autor '2' in der Kategorie 'Seite' im Jahr 2012 interpretiert. Wenn Sie verwenden möchten add_permastruct und lassen Sie Ihre Seitenumbrüche und Feeds-Regeln schön kaskadieren, dann müssen Sie Tags verwenden, die nicht "generisch" sind (mit denen ich meine, dass die Regex-Ausdrücke nicht generisch sind).. %Autor% und %Kategorie% sind gute Beispiele für ein generisches Tag, da diese normalerweise mit jedem Zeichen übereinstimmen.

Beispiel für eine benutzerdefinierte Permastruktur: Datumstyp-Archiv des Typs "Typ"

Die Tags für Jahr, Monat und Tag sind dagegen sehr spezifisch - sie passen nur positive ganze Zahlen der Längen vier und zwei an, so dass wir sie verwenden können add_permastruct für das Datumsarchiv unseres Posttyps. Aufgrund der Besonderheiten der Datums-Tags müssen diese Regeln hinzugefügt werden Vor Die Post-Typ-Permalink-Regel - fügen Sie sofort Folgendes hinzu Vor registrierung deines posttyps:

 // Bitte beachten Sie, dass dies nur für WordPress 3.4+ funktioniert. Http://core.trac.wordpress.org/ticket/19871 add_rewrite_tag ('% book_cpt%', '(book) s', 'post_type ='); add_permastruct ('book_archive', '% book_cpt% /% year% /% monthnum% /% day%');

Im oberen Bereich das benutzerdefinierte Tag % book_cpt% fungiert als hartcodierter Slug, um diese Permastruktur von anderen Regeln zu unterscheiden (wie in der ersten Warnung). Die generierten Regeln gelten nur, wenn % book_cpt% entspricht 'books' und in diesem Fall wird der 'book'-Teil erfasst und als Wert für interpretiert Post-Typ. Bitte beachte, dass add_rewrite_tag akzeptiert nur das dritte Argument seit WordPress 3.4. Sie können jedoch die folgende Problemumgehung verwenden:

 global $ wp_rewrite; $ wp_rewrite-> add_rewrite_tag ('% book_cpt%', '(book) s', 'post_type =');

Nachdem Sie die Bucharchive eingerichtet haben, können Sie dies auch erwarten

 www.example.com/books?year=2012

Würde uns auch ins Bucharchiv 2012 bringen. Beim Testen zeigt sich jedoch, dass wir stattdessen zur Archivseite des Postjahres gelangen:

 www.example.com/2012/

WordPress hat uns aufgrund einer so genannten Kanonisierung auf eine andere Seite umgeleitet.


Kanonische Weiterleitung

Normalerweise gibt es viele URLs, die auf den gleichen Inhalt Ihrer Website verweisen können. Zum Beispiel:

 www.example.com/year/2012 www.example.com/year/2012/page/1 www.example.com/2012///////page/1 www.example.com/index.php / 2012 / www.example.com/index.php////2012///page/1

Bringt Sie alle zur ersten Seite Ihres 2012-Archivs. Aus SEO-Sicht ist das nicht so toll - wir können nicht davon ausgehen, dass Suchmaschinen diese URLs als dieselbe Ressource erkennen und diese URLs möglicherweise miteinander konkurrieren. Google bestraft Sie möglicherweise auch aktiv für doppelten Inhalt. Zwar ist es gut, festzustellen, wann diese Duplizierung nicht "bösartig" ist, es empfiehlt jedoch, diese überflüssigen URLs an eine bevorzugte "kanonische" (oder Standard-) URL weiterzuleiten. Das nennt man Kanonisierung.

Auf diese Weise können Sie nicht nur Bewertungen wie Link-Popularität konsolidieren, sondern auch Ihre Benutzer. Wenn sie eine hässliche oder "falsche" URL verwenden - sie werden zur "richtigen" URL geleitet - und was sich in ihrer Adressleiste befindet, ist das, worauf sie zurückkehren.

Seit 2.1.0 hat WordPress die kanonische Umleitung durchgeführt und sogar eine fundierte Schätzung des gesuchten Inhalts vorgenommen, wenn die ursprüngliche Abfrage einen 404-Wert zurückgegeben hat. Leider führt WordPress in diesem Fall die falsche URL aus. Dies liegt daran, dass die von uns eigentlich gewünschte URL von WordPress nicht nativ verstanden wird und der "post type" -Teil der URL ignoriert wurde. Glücklicherweise können wir jedoch die verwenden redirect_canonical filtern, um dies zu beheben.

 add_filter ('redirect_canonical', 'wptuts_redirect_canonical', 10, 2); Funktion wptuts_redirect_canonical ($ redirect_url, $ request_url) global $ wp_rewrite; // Abbruch, wenn keine hübschen Permalinks verwendet wird, ist ein Feed oder kein Archiv für den Beitragstyp 'book', wenn (! $ Wp_rewrite-> using_permalinks () || is_feed () ||! Is_post_type_archive ('book')) zurückgegeben wird $ redirect_url; // Holen Sie sich die ursprünglichen Abfrageteile. $ Redirect = @parse_url ($ request_url); $ original = $ redirect_url; if (! isset ($ redirect ['query'])) $ redirect ['query'] = "; // Wenn ist Jahr / Monat / Tag - Jahr anhängen if (is_year () || is_month () || is_day ( )) $ year = get_query_var ('year'); $ redirect ['query'] = remove_query_arg ('year', $ redirect ['query']); $ redirect_url = user_trailingslashit (get_post_type_archive_link ('book')) year; // If ist Monat / Tag - Monat anhängen if (is_month () || is_day ()) $ month = zeroise (intval (get_query_var ('monthnum')), 2); $ redirect ['query'] = remove_query_arg ('monthnum', $ redirect ['query']); $ redirect_url. = '/'.$month; // Wenn Tag ist - Tag anhängen if (is_day ()) $ day = zeroise (intval ( get_query_var ('day')), 2); $ redirect ['query'] = remove_query_arg ('day', $ redirect ['query']); $ redirect_url. = '/'.$day; // Wenn paged , Seitenumbruch anwenden, wenn (get_query_var ('paged')> 0) $ paged = (int) get_query_var ('paged'); $ redirect ['query'] = remove_query_arg ('paged', $ redirect ['query']) if ($ paged> 1) $ redirect_url. = user_trailingslashit ("/ page / $ paged", 'paged');  if ($ redirect_url == $ original) gibt $ original zurück; // Anheftung zusätzlicher Abfrage-Vars $ redirect ['query'] = preg_replace ('# ^ \ ?? & *? #', ", $ redirect ['query'])); if ($ redirect_url &&! leer ($ redirect ['query']))) parse_str ($ redirect ['query'], $ _parsed_query); $ _parsed_query = array_map ('rawurlencode', $ _parsed_query); $ redirect_url = add_query_arg ($ _parsed_query, $ rediray) $ redirect_url;

Die obige Funktion ist langwierig, aber nicht sehr kompliziert. Es könnte verbessert werden und ist nur als Beispiel dafür gedacht, was Sie mit dem tun können redirect_canonical Filter. Zuerst wird geprüft, ob die Permalinks aktiviert sind, dass wir hinter unserem 'Buch'-Archiv sind und es kein Feed ist. Dann prüft es wiederum:

  1. Ist es ein Jahr, Monat oder Tag Archiv? Entfernen Sie in diesem Fall die Variable 'year' aus der Abfragezeichenfolge, und legen Sie die Weiterleitungs-URL auf fest www.example.com/books/[year]
  2. Ist es ein Monats- oder Tagesarchiv? Wenn ja, entfernen Sie die Variable 'monthnum' aus der Abfragezeichenfolge und hängen Sie den Wert an die Weiterleitungs-URL an: www.example.com/books/[jahre+/[monthnum]
  3. Ist es ein Tagesarchiv? Wenn ja, entfernen Sie die Variable "day" aus der Abfragezeichenfolge und hängen Sie den Wert an die Weiterleitungs-URL an: www.example.com/books/[jahre+/[monthnum.html/[day]
  4. Wenn schließlich eine ausgelagerte Variable vorhanden ist, hängen Sie diese an die Weiterleitungs-URL an

Tags in den Beitragstypen Permalinks

Eine weitere Funktion, die nicht für Posttypen oder Taxonomien "out of the box" unterstützt wird, ist die Verwendung von Tags in der Permalink-Struktur. Während Tags, die im 'slug' des Umschreibungsarrays eines Posttyps (oder einer Taxonomie) verwendet werden, korrekt interpretiert werden, ersetzt WordPress diese Tags nicht durch die entsprechenden Werte, wenn Permalinks generiert werden. Wir müssen sie selbst ersetzen. Bei Verwendung solcher Tags wird jedoch auch die Archivseite des Beitragstyps unterbrochen. Daher verwenden wir eine andere Methode. Nehmen wir als Beispiel an, wir möchten, dass unser benutzerdefinierter Posttyp 'book' die Struktur hat:

 www.example.com/books/[some-genre\/[a-book]

Ich verwende das Beispiel einer benutzerdefinierten Taxonomie, aber die gleichen Methoden können für jede Permastruktur verwendet werden (z. B. Datum, Autor oder sogar ein benutzerdefiniertes Feld). Zuerst fügen wir die Umschreibungsregel hinzu:

 Funktion wptuts_custom_tags () add_rewrite_rule ("^ books / ([^ /] +) / ([^ /] +) /?", 'index.php? post_type = book & genre = $ passt [1] & book = $ stimmt überein [2 ]','oben');  add_action ('init', 'wptuts_custom_tags');

Jetzt, www.example.com/book/fiction/the-wizard-of-oz, zeigt zum Beispiel auf das Buch 'der Zauberer von Oz'. Der von WordPress generierte Permalink erzeugt jedoch immer noch www.example.com/book/the-wizard-of-oz. Der nächste Schritt besteht darin, die erzeugte Permalink zu ändern.

In Teil 1 haben wir etwas Ähnliches getan, als wir ein benutzerdefiniertes Tag in der Post-Permalink-Struktur verwenden wollten. Dann haben wir die verwendet post_link Filter; Dieses Mal verwenden wir das Äquivalent für benutzerdefinierte Posttypen, das post_type_link Filter. Mit diesem Haken können wir unsere Struktur in die Permalinks der Bücher einfügen.

 Funktion wptuts_book_link ($ post_link, $ id = 0) $ post = get_post ($ id); if (is_wp_error ($ post) || 'book'! = $ post-> post_type || leer ($ post-> post_name)) Rückgabe $ post_link; // Holen Sie sich das Genre: $ terms = get_the_terms ($ post-> ID, 'genre'); if (is_wp_error ($ terms) ||! $ terms) $ genre = 'unkategorisiert';  else $ genre_obj = array_pop ($ terms); $ genre = $ genre_obj-> slug;  return home_url (user_trailingslashit ("books / $ genre / $ post-> post_name"));  add_filter ('post_type_link', 'wptuts_book_link', 10, 2);

Manipulieren von WordPress-Rewrites

Erweitern wir die obige Permalink-Struktur, um Folgendes zu erreichen:

  • Ein bestimmtes Buch: www.example.com/books/[some-genre\/[a-book]
  • Alle Bücher in einem Genre: www.example.com/books/[some-genre]
  • Alle Bücher: www.example.com/books/

Erinnern Sie sich daran, dass die Reihenfolge, in der Umschreibungsregeln hinzugefügt werden, von Bedeutung ist. Vor allem hinzugefügte Regeln haben Priorität.

Zuerst registrieren wir unser benutzerdefiniertes Taxonomie-Genre mit:

 $ args = array (… 'rewrite' => array ('slug' => 'books'),…) register_taxonomy ('genre', $ args);

Dies fügt die folgende Permastruktur hinzu:

  • Bücher in einem Genre: www.example.com/books/[some-genre]

Nach der Registrierung der Taxonomie registrieren wir unseren benutzerdefinierten Beitragstyp wie folgt:

 $ args = array (… 'rewrite' => array ('slug' => 'books'),…) register_post_type ('book', $ args);

Dies würde die folgenden Regeln registrieren:

  • Alle Bücher: www.example.com/books/ (was wir wollen)
  • Ein bestimmtes Buch: www.example.com/books/[a-book] (was wir nicht tun)

Die zweite steht jedoch in Konflikt mit der konkurrierenden Regel, die bei der Registrierung unserer Taxonomie hinzugefügt wurde. Die resultierende Struktur ist:

  • Buch mit dem Namen 'slug': www.example.com/books/fiction/slug
  • Bücher im Genre 'slug': www.example.com/books/slug
  • Alle Bücher: www.example.com/books/

EP_Masken

Früher, als wir uns mit der Registrierung von Beitragstypen, Taxonomien (oder sonstigen Permusturen) befassten, ließen wir uns in WordPress unsere eigenen Angaben machen.ep_mask'. Also was sind sie??

Im ersten Teil haben wir untersucht, wie wir Endpunkte hinzufügen können add_rewrite_endpoint. Das zweite Argument in dieser Funktion ist eine Konstante (oder eine Kombination von Konstanten mit bitweisen Operatoren), die bestimmt, wo der Endpunkt hinzugefügt wird. Zum Beispiel:

 add_rewrite_endpoint ('form', EP_PAGES);

Fügt die Umschreibung hinzu Formular (/(.*))?/?$ zu jeder Seite Permalink und:

 add_rewrite_endpoint ('json', EP_PAGES | EP_PERMALINKS);

Fügt die Umschreibung hinzu json (/(.*))?/?$ zu jedem Post und zu jeder Seite Permalink. Diese Konstanten spezifizieren also einen 'Ort' (d. H. 'Am Ende eines Post-Permalink') und werden aufgerufen Endpunktmasken (oder ep masken).

Wenn Sie einen Beitragstyp registrieren, registriert WordPress eine Permastruktur - und damit eine Endpunktmaske. Wenn dann die Umschreiberegeln generiert werden, werden auch die Endpunkt-Umschreiberegeln hinzugefügt, die dieser Endpunktmaske hinzugefügt wurden.

Wenn beispielsweise WordPress den Standard-Post-Typ "Page" registriert, wird die Endpunktmaske zugeordnet EP_PAGES mit der Seite Permastruktur. Dann werden alle Endpoint-Neuschreibungsregeln zum hinzugefügt EP_PAGES werden tatsächlich zu dieser Seite Permastruktur hinzugefügt. Wenn Sie einen Beitragstyp registrieren, können Sie Ihre eigene Endpunktmaske angeben oder eine vorhandene verwenden. Standardmäßig ist es EP_PERMALINKS - Dies bedeutet, dass alle Regeln zum Umschreiben von Endpunkten hinzugefügt werden EP_PERMALINKS werden den Umschreiberegeln Ihres benutzerdefinierten Beitragstyps hinzugefügt.

Natürlich möchten Sie nicht, dass Endpunktregeln für Ihren Beitragstyp hinzugefügt werden. In diesem Fall können Sie die Endpunktmaske verwenden EP_NONE), oder Sie möchten einige Regeln zum Umschreiben von Endpunkten hinzufügen nur zu Ihrem benutzerdefinierten Beitragstyp. Dazu müssen Sie zunächst eine Endpunktmaske erstellen, die nichts anderes als eine Konstante ist, die Folgendes erfüllt:

  1. Der Wert der Konstante ist eine positive Zahl und eine Potenz von 2: 2x (z. B. 2097152 = 221)
  2. Dieser Wert ist einzigartig

Die Anforderung von 2 ist erforderlich, da WordPress mithilfe der Binärlogik festlegt, wo Endpunktregeln hinzugefügt werden sollen. Unglücklicherweise ist dies fast unmöglich zu überprüfen. Daher empfiehlt es sich, Endpunktmasken nur bei Bedarf hinzuzufügen und einen sehr hohen Wert zu erhalten (z. B. 221). Zum Zeitpunkt des Schreibens 20 bis zu 213 werden von Core verwendet.

Definieren Sie Ihre Endpunktmaske, bevor Sie Ihren Post-Typ oder Ihre Taxonomie registrieren:

 define ('EP_BOOK', 8388608); // 8388608 = 2 ^ 23 $ args = array ('labels' => $ labels, 'has_archive' => true, 'rewrite' => array ('slug' => 'books "with_front" => false "feed") => true 'pages' => true 'ep_mask' => EP_BOOK)); register_post_type ('book', $ args); // Dann können Sie die Endpunktregeln für diese Endpunktmaske neu schreiben add_rewrite_endpoint ('loan', EP_BOOK);

(Hinweis: Das Obige verwendet WordPress 3.4-Argumente. Wenn Sie eine ältere Version von WordPress verwenden, müssen Sie die jetzt veraltete Version verwenden permalink_epmask.). Ab WordPress 3.4 können Sie auch eine Endpunktmaske angeben, wenn Sie eine Taxonomie registrieren.


Zusammenfassung

In diesem Tutorial habe ich die Grundlagen der Umschreibungs-API für Posttypen und Taxonomien, aber auch einige fortgeschrittenere Themen behandelt. WordPress 'Umgang mit Umschreibungen ist (notwendigerweise) komplex und der beste Weg, es zu verstehen, besteht darin, in den Quellcode einzutauchen und ihn mit dem Gelernten und einem Umschreibanalysator-Plug-In zu testen.

Im Moment gibt es ein paar Tickets, die sich durch die WordPress-Entwicklungsumgebung Trac bewegen, die sich auf die Rewrite-API bezieht. In Zukunft sehen wir eine viel einfachere und konfliktfreiere Art, Endpunktmasken zu übergeben.

  • Verbessern Sie die Dokumentation und Verwendbarkeit von WP_Rewrite Endpoint
  • Bessere Unterstützung für benutzerdefinierte Beitragstypen in WP_Rewrite