The Rewrite API berichttypen en taxonomieën

Dit is deel twee van een serie die de Rewrite API van WordPress bekijkt. In deel één namen we een korte stop tour door de basis van de Rewrite API van WordPress. In deze tutorial zullen we kijken naar de herschrijfinstellingen die voor ons beschikbaar zijn bij het registreren van een posttype of taxonomie. Hoewel aangepaste berichttypen en taxonomieën (in tegenstelling tot de standaardberichten, categorieën en tags) geen voordeel hebben van de interface Instellingen -> Permalink, is het nog steeds redelijk eenvoudig om herschrijvingen voor aangepaste typen in te stellen. We zullen ook de methoden gebruiken die in deel een zijn geïntroduceerd, dus als je dat nog niet hebt gedaan, raad ik je aan WordPress 'Rewrite API Deel één te lezen: De basis.


De herschrijfregels doorspoelen

Wanneer u een aangepast type registreert, registreert WordPress ook herschrijfregels (eigenlijk, niet helemaal, en ik zal uitleggen waarom in de sectie 'Permastructures'). Zoals vermeld in deel één, worden deze regels pas opgenomen als de herschrijfregels zijn 'doorgespoeld'. Thema's en plug-ins kunnen dit 'doorspoelen' forceren door te callen flush_rewrite_rules (). Dit moet, en zou slechts één keer gedaan moeten worden bij activering en dan weer bij deactivering (om jezelf op te ruimen).

Vanzelfsprekend moet je ze hebben toegevoegd voordat je de herschrijfregels hebt doorgespoeld. Echter, de in het haak op welke berichttypen moeten worden geregistreerd, is al geschoten en toen was je plug-in of thema nog niet actief en dus zijn je berichttypen en taxonomieën nog niet geregistreerd. Om de herschrijfregels die bij uw berichttypen en taxonomieën horen te registreren, betekent dit dat u ze 'handmatig' moet registreren bij activering, voordat u de herschrijfregels doorspoelt. Dus dit zou je ingesteld moeten zijn:

 functie wptuts_register_types () // functie die uw aangepaste berichttype en taxonomieën registreert add_action ('init', 'wptuts_register_types'); function wptuts_plugin_activation () // Registreer typen om de herschrijfregels te registreren wptuts_register_types (); // Spoel ze vervolgens flush_rewrite_rules ();  register_activation_hook (__FILE__, 'wptuts_plugin_activation'); function wptuts_plugin_deactivation () flush_rewrite_rules ();  register_activation_hook (__FILE__, 'wptuts_plugin_activation');

Thema's kunnen de haken gebruiken after_switch_theme voor activering en switch_theme voor deactivering.


Aangepaste berichttypes

Wanneer u een berichttype registreert bij register_post_type een van de beschikbare argumenten is het herschrijfargument. Dit moet een array zijn met de volgende toetsen:

  • naaktslak - een slug die wordt gebruikt om het berichttype in URL's te identificeren. De naaktslak van de post is hieraan toegevoegd voor de permalink van de post, bijvoorbeeld. www.example.com/boeken/de tovenaar van Oz
  • with_front - waar of niet waar. Als de permalink-structuur van je bericht begint met een constante basis, zoals '/ blog', kan dit ook worden toegevoegd aan de permalink-structuur van je aangepaste berichttype door deze in te stellen op true, bijvoorbeeld waar zal geven www.example.com/blog/books/ en vals www.example.com/books/
  • feeds - waar of niet waar. Of u feed rewrite-regels wilt genereren, bijvoorbeeld. www.example.com/books/feed/rss en www.example.com/book/rss. De standaardwaarde is de waarde van has_archive.
  • pagina's - waar of niet waar. Of regel moet worden gegenereerd voor 'mooie' paginering voor het archief van het posttype, bijvoorbeeld. www.example.com/books/page/2 in plaats van www.example.com/books?page=2. Standaard ingesteld op waar.
  • ep_mask - Dit was vroeger een afzonderlijk argument: permalink_epmask. Vanaf 3.4 wordt het verplaatst naar de herschrijfarray. De standaard is EP_PERMALINK.

De toetsen 'feeds' en 'pagina's' hebben alleen betrekking op de post-type archiefpagina (waarvoor u de. Moet hebben ingesteld has_archive argument tot waar). Vanuit deze herschrijfserie verwerkt WordPress automatisch de herschrijfregels voor uw berichttypen. Als voorbeeld:

 $ labels = array ('name' => __ ('Books', 'your-plugins-translation-domain'), // array of labels); $ args = array ('labels' => $ labels, 'has_archive' => true, 'rewrite' => array ('slug' => 'books', 'with_front' => false, 'feed' => true, 'pages' => true)); register_post_type ( 'boek', $ args);

Zou de volgende herschrijfregels geven:

  • De permalink van het boek 'de tovenaar van Oz': www.example.com/books/the-wizard-of-oz
  • Archief van alle boeken www.example.com/books (en www.example.com/books/page/2)
  • De feed van het bovenstaande archief: www.example.com/books/feed/rss (en www.example.com/books/rss)

taxonomieën

De register_taxonomy () functie biedt minder opties:

  • naaktslak - een naaktslak om de taxonomie te identificeren, b.v.. www.example.com/genre/geschiedenis
  • with_front - Zoals hierboven.
  • hiërarchische - waar of niet waar. Indien ingesteld op true en de taxonomie is hiërarchisch, geeft de term permalink de hiërarchie weer. Standaard ingesteld op false.
  • ep_mask - Toegevoegd in 3.4. Zie EP Mask-gedeelte hieronder.

De eerste twee opties zijn vergelijkbaar met het bovenstaande. De hiërarchische optie geeft de term permalinks dezelfde structuur als pagina's. Laat 'Geschiedenis' bijvoorbeeld een genre zijn en 'Militaire geschiedenis' een subgenre. Met hiërarchisch ingesteld op false, heeft 'Military History' een permalink:

 www.example.com/genre/military-history

Overwegende dat, ingesteld op waar, het zal hebben:

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

Als u een taxonomie registreert, worden de feeds van uw taxonomie-termen automatisch geregistreerd:

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

U kunt de feed-link permalink naar elke willekeurige taxonomie-term verkrijgen $ feed_link = get_term_feed_link ($ term_id, $ taxonomy, $ feed)


Posttype archieven

WordPress produceert standaard geen 'mooie' permalinks voor de jaar-, maand- of dagarchieven van uw aangepaste berichttype (noch het archief van de auteur - maar we laten die voor nu achter). Terwijl:

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

Correct geeft een archief van alle boeken gepubliceerd in mei 2012:

 www.example.com/books/2012/05

Geeft een 404-fout. We kunnen echter eenvoudig extra herschrijfregels toevoegen met behulp van de beschikbare rewrite API-methoden die we in deel een hebben behandeld. Eén methode is om de volgende lijst met herschrijfregels toe te voegen wanneer u uw berichttype registreert:

 // Dagarchief (en paginering toevoegen) add_rewrite_rule ("books / ([0-9] 4) / ([0-9] 2) / ([0-9] 2) / page /? ([0-9] 1) /?", 'index.php? post_type = boek & jaar = $ wedstrijden [1] & monthnum = $ komt overeen met [2] & dag = $ wedstrijden [3] & opgeroepen = $ wedstrijden [4] ','top'); add_rewrite_rule ( "boeken / ([0-9] 4) / ([0-9] 2) / ([0-9] 2) /?", 'index.php? post_type = book & jaar = $ wedstrijden [1] & monthnum = $ komt overeen met [2] & dag = $ wedstrijden [3]', 'top'); // Voeg maandarchief (en paginering) add_rewrite_rule toe ("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 ( "boeken / ([0-9] 4) / ([0-9] 2) /?", 'index.php? post_type = boek & jaar = $ wedstrijden [1] & monthnum = $ komt overeen met [2 ]','top'); // Voeg jaararchief (en paginering) add_rewrite_rule toe ("books / ([0-9] 4) / page /? ([0-9] 1,) /?", 'Index.php? Post_type = book & jaar = $ wedstrijden [1] & opgeroepen = $ wedstrijden [2]', 'top'); add_rewrite_rule ( "boeken / ([0-9] 4) /?", 'index.php post_type = boek & jaar = $ wedstrijden [1]?', 'top');

Dit kan gemakkelijk een beetje rommelig worden - vooral als je bedenkt dat je extra regels zou moeten toevoegen als je wilde dat je archieven mooie URL's voor hun feeds zouden ondersteunen. Het bovenstaande illustreert echter een belangrijk feit over het toevoegen van aangepaste regels: de volgorde waarin de regels worden toegevoegd, is belangrijk.

Bedenk dat deze regels worden toegevoegd aan de herschrijfarray in de volgorde waarin u belt add_rewrite_rule. Bij het parseren van een verzoek gebruikt WordPress de eerste overeenkomende regel. Probeer de volgorde te veranderen waarin de archiefregels voor het jaar en de maand worden toegevoegd. Je zult dat vinden www.example.com/books/2012/04/ brengt je naar het archief van 2012. Dit komt omdat die URL overeenkomt met de patronen voor zowel het jaar- als het maandarchief, maar de eerste is als eerste toegevoegd. Vergeet niet om altijd eerst de meer specifieke regel toe te voegen.

Aan de andere kant, als u een herschrijfregel toevoegt, waarvan de regex al als regel bestaat, wordt die regel door de nieuwe overschreven.


Permastructures

Er is een eenvoudige manier om het bovenstaande te bereiken: add_permastruct. Deze functie wordt door WordPress gebruikt om 'permastructuren' te maken, waaruit het herschrijfregels genereert (zoals het bovenstaande), die paginering en feeds verwerken. Wanneer u een aangepast berichttype registreert, maakt WordPress niet automatisch alle herschrijfregels. In plaats daarvan registreert het een permastructuur - en alleen wanneer de regels worden gegenereerd (dat wil zeggen wanneer ze worden gespoeld) gebruikt WordPress die permastructuren om de feitelijke herschrijfregels te genereren.

Een voorbeeld van een permastructuur is degene die u gebruikt in Instellingen -> Permalinks. Deze accepteren alle 'hardgecodeerde' slugs of tags die standaard zijn of zijn toegevoegd add_rewrite_tag, die we in deel een hebben behandeld. Bijvoorbeeld de permastructuur % Jaar% /% categorie% /% author% zou de volgende herschrijfregels genereren:

  • 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

De add_permastruct Functie

De add_permastruct functie accepteert vier argumenten:

  • naam - Een unieke naaktslak om uw permastructuur te identificeren
  • struct - De permastructuur zelf b.v. '% Jaar% /% categorie% /% author%'
  • with_front - waar of niet waar. Dit is hetzelfde argument als bij het registreren van het berichttype
  • ep_mask - Zie EP Mask-gedeelte hieronder

Een paar waarschuwingen over het gebruik add_permastruct moet hier worden gemaakt. Ten eerste: u moet ervoor zorgen dat een aangepaste permastructuur niet botst met de herschrijfregels van WordPress voor berichten en pagina's. Dit kan gedaan worden door je aangepaste permastructuur voor te bereiden met iets hard gecodeerd. Bijvoorbeeld:

 'Iets-hard-coded /% jaar% /% monthnum% /% day%'

Ten tweede - de regels worden in die volgorde toegevoegd - dus als uw tags 'te algemeen' zijn, mogen de laatste regels nooit worden toegepast. Bijvoorbeeld, de bovenstaande structuur (die u kunt proberen op uw Instellingen -> Permalinks-pagina), werkt over het algemeen goed, behalve dat:

 www.example.com/2012/page/2

Wordt geïnterpreteerd als de pagina met berichten van auteur '2', in categorie 'pagina' in 2012. Als je wilt gebruiken add_permastruct en hebben uw paginering en feeds regels een mooie cascade, dan moet u tags gebruiken die niet 'generiek' zijn (waarmee ik bedoel dat de regex-expressies niet generiek zijn). %schrijver% en %categorie% zijn goede voorbeelden van een generieke tag omdat deze doorgaans overeenkomen met elk willekeurig teken.

Voorbeeld van een aangepaste Permastructuur: Posttype datumarchief

De tags voor het jaar, de maand en de dag aan de andere kant zijn erg specifiek - ze komen alleen overeen met positieve gehele getallen van lengte vier en twee, dus we kunnen gebruiken add_permastruct voor het datumarchief van ons posttype. Vanwege de specifieke aard van de datumtags, moeten deze regels worden toegevoegd voor de regel voor permalink van het posttype - voeg dus onmiddellijk het volgende toe voor registratie van uw berichttype:

 // Houd er rekening mee dat dit alleen werkt op WordPress 3.4+ 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%');

In het bovenstaande de aangepaste tag % Book_cpt% fungeert als een hard-gecodeerde slak om deze permastructuur te onderscheiden van andere regels (volgens de eerste waarschuwing). De gegenereerde regels zijn alleen van toepassing als % Book_cpt% komt overeen met 'boeken' en in dat geval wordt het gedeelte 'boek' vastgelegd en geïnterpreteerd als de waarde voor post_type. Houd er rekening mee dat add_rewrite_tag accepteert alleen het derde argument sinds WordPress 3.4. U kunt echter de volgende work-around gebruiken:

 globale $ wp_rewrite; $ Wp_rewrite-> add_rewrite_tag ( '% book_cpt%', '(boek) s', 'post_type =');

Als je de boekenarchieven hebt opgezet, kun je dat ook verwachten

 www.example.com/books?year=2012

Zou ons ook naar het boekenarchief van 2012 brengen. Als u het echter test, blijkt dat we in plaats daarvan naar de archiefpagina na het jaar gaan:

 www.example.com/2012/

WordPress heeft ons doorverwezen naar een andere pagina vanwege iets dat bekendstaat als canonicalization.


Canonical Redirect

Meestal zijn er veel URL's die naar dezelfde inhoud op uw website kunnen verwijzen. Bijvoorbeeld:

 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

Brengt u allemaal naar de eerste pagina van uw archief uit 2012. Vanuit SEOperspectief is dit niet geweldig - we kunnen niet aannemen dat zoekmachines deze URL's herkennen als dezelfde bron, en deze URL's kunnen uiteindelijk met elkaar concurreren. Google kan u ook actief bestraffen voor dubbele inhoud, en hoewel het goed is om te bepalen wanneer deze duplicatie niet 'schadelijk' is, wordt u toch aangeraden deze overtollige URL's om te leiden naar één gewenste 'canonieke' (of standaard) URL. Dit heet standaardisatieproblemen.

Hierdoor kunt u niet alleen beoordelingen zoals linkpopulariteit consolideren, maar ook uw gebruikers helpen. Als ze een lelijke of 'onjuiste' URL gebruiken, worden ze naar de 'juiste' URL gebracht en wat in hun adresbalk staat, is waar ze eerder naar terugkeren.

Sinds 2.1.0 heeft WordPress canonieke doorverwijzing afgehandeld, zelfs een weloverwogen gok nemen naar de gewilde inhoud als de oorspronkelijke vraag een 404 retourneerde. Helaas, in dit geval, wordt WordPress omgeleid naar de verkeerde URL. Dit komt omdat de URL die we eigenlijk willen, niet standaard wordt begrepen door WordPress en het 'post type' deel van de URL heeft genegeerd. Gelukkig kunnen we echter het redirect_canonical filter om dit te repareren.

 add_filter ('redirect_canonical', 'wptuts_redirect_canonical', 10, 2); functie wptuts_redirect_canonical ($ redirect_url, $ requested_url) global $ wp_rewrite; // Afbreken als geen mooie permalinks worden gebruikt, is een feed of geen archief voor het 'boek' van het berichttype als (! $ Wp_rewrite-> using_permalinks () || is_feed () ||! Is_post_type_archive ('boek')) teruggeeft $ REDIRECT_URL; // Krijg de originele vraagdelen $ redirect = @parse_url ($ requested_url); $ original = $ redirect_url; if (! isset ($ redirect ['query'])) $ redirect ['query'] = "; // If is year / month / day - append year if (is_year () || is_month () || is_day ( )) $ year = get_query_var ('jaar'); $ redirect ['query'] = remove_query_arg ('jaar', $ redirect ['query']); $ redirect_url = user_trailingslashit (get_post_type_archive_link ('boek')). $ jaar; // Als is maand / dag - voeg maand toe als (is_month () || is_day ()) $ month = zeroise (intval (get_query_var ('monthnum')), 2); $ redirect ['query'] = remove_query_arg ('monthnum', $ redirect ['query']); $ redirect_url. = '/'.$month; // If is day - append day if (is_day ()) $ day = zeroise (intval ( get_query_var ('dag')), 2); $ redirect ['query'] = remove_query_arg ('day', $ redirect ['query']); $ redirect_url. = '/'.$day; // Indien opgeroepen , voeg paginering toe als (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');  als ($ redirect_url == $ origineel) $ origineel retourneert; // tack op een extra zoekopdracht vars $ redirect ['query'] = preg_replace ('# ^ \ ?? & *? #', ", $ redirect ['query']); if ($ redirect_url &&! empty ($ redirect ['query'])) parse_str ($ redirect ['query'], $ _parsed_query); $ _parsed_query = array_map ('rawurlencode', $ _parsed_query); $ redirect_url = add_query_arg ($ _parsed_query, $ redirect_url); retourneer $ redirect_url;

De bovenstaande functie is lang, maar niet erg ingewikkeld. Het kan worden verbeterd, en is alleen bedoeld als een voorbeeld van wat je kunt doen met de redirect_canonical filter. Het controleert eerst of mooie permalinks zijn ingeschakeld, of we naar ons 'boek'-archief zoeken en het geen feed is. Vervolgens controleert het om de beurt:

  1. Is het een jaar-, maand- of dagarchief? Als dat het geval is, verwijdert u de variabele 'jaar' uit de queryreeks en stelt u de omleidings-URL in www.example.com/books/[year]
  2. Is het een maand- of dagarchief? Als dit het geval is, verwijdert u de variabele 'monthnum' uit de queryreeks en voegt u de waarde toe aan de omleidings-URL: www.example.com/books/[year]/[monthnum]
  3. Is het een dagarchief? Als dat het geval is, verwijdert u de variabele 'day' uit de queryreeks en voegt u de waarde toe aan de omleidings-URL: www.example.com/books/[year]/[monthnum]/[day]
  4. Tenslotte, als er een wisselbare variabele is, voeg deze toe aan de omleidings-URL

Tags in het posttype Permalinks

Een andere functie die niet 'out of the box' voor berichttypen of taxonomieën wordt ondersteund, is het gebruik van tags in de permalink-structuur. Terwijl de tags die in de 'slug' van de herschrijfarray van een berichttype (of taxonomie) worden gebruikt correct worden geïnterpreteerd, vervangt WordPress deze tags niet met hun juiste waarden bij het genereren van de permalinks - we moeten deze tags zelf vervangen. Het gebruik van tags zoals deze breekt echter ook de archiefpagina van het berichttype - dus we zullen een andere methode gebruiken. Stel bijvoorbeeld dat we willen dat ons aangepaste 'boek' van het posttype de structuur heeft:

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

Ik gebruik het voorbeeld van een aangepaste taxonomie, maar dezelfde methoden kunnen worden gebruikt voor elke permastructuur (bijvoorbeeld inclusief de datum, auteur of zelfs een aangepast veld). Allereerst voegen we de herschrijfregel toe:

 functie wptuts_custom_tags () add_rewrite_rule ("^ books / ([^ /] +) / ([^ /] +) /?", 'index.php? post_type = book & genre = $ matches [1] & book = $ matches [2 ]','top');  add_action ('init', 'wptuts_custom_tags');

Nu, www.example.com/book/fiction/the-wizard-of-oz, verwijst bijvoorbeeld naar het boek 'de tovenaar van Oz'. De permalink gegenereerd door WordPress produceert echter nog steeds www.example.com/book/the-wizard-of-oz. De volgende stap is het wijzigen van de geproduceerde permalink.

We deden iets soortgelijks in deel één toen we een aangepaste tag wilden gebruiken in de post permalink-structuur. Toen gebruikten we de post_link filter; dit keer gebruiken we het equivalent voor aangepaste berichttypen, de post_type_link filter. Met behulp van deze haak kunnen we onze structuur in de permalinks van de boeken injecteren.

 functie wptuts_book_link ($ post_link, $ id = 0) $ post = get_post ($ id); if (is_wp_error ($ post) || 'book'! = $ post-> post_type || empty ($ post-> post_name)) return $ post_link; // Verkrijg het genre: $ terms = get_the_terms ($ post-> ID, 'genre'); if (is_wp_error ($ terms) ||! $ terms) $ genre = 'uncategorised';  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);

Het manipuleren van WordPress Rewrites

Laten we de bovenstaande permalink-structuur uitbreiden om het volgende te bereiken:

  • Een specifiek boek: www.example.com/books/[some-genre]/[a-book]
  • Alle boeken in een genre: www.example.com/books/[some-genre]
  • Alle boeken: www.example.com/books/

Bedenk dat de volgorde waarin herschrijfregels worden toegevoegd, van belang is. Meer in het bijzonder hebben eerst toegevoegde regels prioriteit.

Dus, eerst registreren we ons aangepaste taxonomie 'genre' met:

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

Dit voegt de volgende permastructuur toe:

  • Boeken in een genre: www.example.com/books/[some-genre]

Nadat we de taxonomie hebben geregistreerd, registreren we ons aangepaste berichttype als volgt:

 $ args = array (... 'rewrite' => array ('slug' => 'books'), ...) register_post_type ('boek', $ args);

Dit zou de volgende regels registreren:

  • Alle boeken: www.example.com/books/ (wat we willen)
  • Een specifiek boek: www.example.com/books/[a-book] (wat we niet doen)

De tweede is echter in strijd met (en wordt 'geslagen' door) de concurrerende regel die is toegevoegd toen we onze taxonomie registreerden. De resulterende structuur is:

  • Boek met de naam 'slug': www.example.com/books/fiction/slug
  • Boeken in genre 'slug': www.example.com/books/slug
  • Alle boeken: www.example.com/books/

EP_Masks

Eerder toen we keken naar het registreren van berichttypen, taxonomieën (of anderszins, permstructuren), lieten WordPress ons onze eigen 'ep_mask'. Dus wat zijn ze?

In deel één hebben we gekeken naar hoe we eindpunten kunnen toevoegen add_rewrite_endpoint. Het tweede argument in die functie is een constante (of combinatie van constanten met behulp van bitsgewijze operatoren), die bepalen waar het eindpunt wordt toegevoegd. Bijvoorbeeld:

 add_rewrite_endpoint ('form', EP_PAGES);

Voegt de herschrijving toe vorm (/(.*))?/?$ naar elke pagina permalink en:

 add_rewrite_endpoint ('json', EP_PAGES | EP_PERMALINKS);

Voegt de herschrijving toe json (/(.*))?/?$ naar elke post en pagina permalink. Dus deze constanten specificeren een 'locatie' (dat wil zeggen 'aan het einde van een post permalink') en ze worden genoemd eindpuntmaskers (of ep-maskers).

Wanneer u een berichttype registreert, registreert WordPress een permastructuur - en daaraan gekoppeld een eindpuntmasker. Wanneer de herschrijfregels worden gegenereerd, voegt het ook de herschrijfregels voor het eindpunt toe die aan dat eindpuntmasker zijn toegevoegd.

Bijvoorbeeld, wanneer WordPress het standaard 'Pagina' berichttype registreert - het associeert het eindpuntmasker EP_PAGES met de permastructuur van de pagina. Vervolgens worden regels voor het herschrijven van eindpunten toegevoegd aan de EP_PAGES zijn eigenlijk toegevoegd aan de permastructuur van die pagina. Wanneer u een berichttype registreert, kunt u uw eigen eindpuntmasker opgeven of een bestaand masker gebruiken. Standaard is dat het EP_PERMALINKS - Dit zijn de regels voor het herschrijven van eindpunten die zijn toegevoegd aan EP_PERMALINKS worden toegevoegd aan de herschrijfregels van uw aangepaste berichttype.

Natuurlijk wilt u misschien niet dat eindpuntregels worden toegevoegd voor uw berichttype (in welk geval u het eindpuntmasker kunt gebruiken EP_NONE), of misschien wilt u sommige regels voor het herschrijven van eindpunten toevoegen enkel en alleen naar uw aangepaste berichttype. Om dit te doen, moet u eerst een eindpuntmasker maken, wat niets meer is dan een constante die voldoet aan:

  1. De waarde van de constante is een positief getal en een macht van 2: 2X (bijvoorbeeld 2097152 = 221)
  2. Deze waarde is uniek

De vereiste kracht van 2 is noodzakelijk omdat WordPress binaire logica gebruikt om te bepalen waar eindpuntregels moeten worden toegevoegd. Helaas is dit bijna onmogelijk te controleren, dus het beste advies is om alleen eindpuntmaskers toe te voegen wanneer dit nodig is en een zeer hoge waarde te geven (bijvoorbeeld 221). Op het moment van schrijven 20 tot 213 worden gebruikt door Core.

Definieer uw eindpuntmasker net voordat u uw berichttype of taxonomie registreert:

 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 ('boek', $ args); // Dan kunt u de herschrijfregels van endpoints naar dit eindpuntmasker add_rewrite_endpoint ('loan', EP_BOOK);

(Opmerking: het bovenstaande gebruikt WordPress 3.4-argumenten.Als u een oudere versie van WordPress gebruikt, moet u de nu verouderde versie gebruiken permalink_epmask.). Vanaf WordPress 3.4 kunt u ook een eindpuntmasker opgeven bij het registreren van een taxonomie.


Samenvatting

In deze zelfstudie heb ik de basis besproken van de herschrijf-API voor berichttypen en taxonomieën, maar ook enkele meer geavanceerde onderwerpen. De verwerking van herschrijvingen door WordPress is (noodzakelijkerwijs) complex en de beste manier om het te begrijpen is om je in de broncode te verdiepen en het uit te testen met behulp van wat je hebt geleerd en een herschreven analyse-plug-in.

Er zijn momenteel een aantal kaartjes die door de WordPress-ontwikkeling Trac werken, met betrekking tot de Rewrite API. In de toekomst zien we een veel eenvoudigere en conflictloze manier om eindpuntmaskers over te dragen.

  • Verbeter de documentatie en bruikbaarheid van WP_Rewrite Endpoint
  • Betere ondersteuning voor aangepaste berichttypen in WP_Rewrite