The Rewrite API The Basics

Dit is deel één van een tweedelige serie die de Rewrite API van WordPress bekijkt. In deze zelfstudie bekijken we hoe herschreven werk en de basismethoden beschikbaar zijn om aangepaste herschrijfregels te maken.


Wat is herschrijven?

WordPress bepaalt, net als alle contentbeheersystemen, welke inhoud moet worden weergegeven op basis van de variabelen (meestal queryparameters genoemd) die aan de server worden doorgegeven. Bijvoorbeeld: http://example.com/index.php?category=3 vertelt WordPress dat we op zoek zijn naar berichten in een categorie met een ID van 3 en http://example.com/index.php?feed=rss vertelt WordPress dat we de feed van de site in RSS-indeling willen hebben.

Helaas kan dit ons verlaten met nogal lelijke URL's:

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

Dit is waar het herschrijven van WordPress ingrijpt. Hiermee kunnen we het bovenstaande vervangen door:

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

Dat is nu niet alleen veel leesbaarder (en gedenkwaardiger) maar ook meer SEO-vriendelijk. Dit is, in een notendop, wat herschrijft.


Hoe werkt het?

Nu http://example.com/portoflio/wordpress/my-fancy-plugin bestaat niet als een map of bestand. Dus hoe biedt WordPress de juiste inhoud? Wanneer WordPress een 'pretty permalink' zoals hierboven ontvangt, moet dit worden omgezet in iets dat het begrijpt, namelijk a query-object. Eenvoudiger is dat het de mooie URL moet nemen en de juiste onderdelen moet toewijzen aan de juiste queryvariabele. Dus voor ons voorbeeld:

http://example.com/portoflio/wordpress/my-fancy-plugin
  • post_type is ingesteld op 'portfolio'
  • portfolio-taxonomie is ingesteld op 'wordpress'
  • portefeuille is ingesteld op 'my-fancy-plugin' (de postnaam)

Dan weet WordPress dat we op zoek zijn naar posts van het type 'portefeuille', in de 'wordpress"portfolio-taxonomie'taxonomieterm met naam'my-fancy-plugin'. (Zoals je misschien al geraden hebt, zijn de eerste twee eigenlijk overbodig). WordPress voert vervolgens die query uit, kiest de juiste sjabloon om de resultaten weer te geven en dient die vervolgens voor de kijker. Maar duidelijk raadt WordPress niet alleen hoe de URL's moeten worden geïnterpreteerd, het moet ook worden verteld ...

Het begint met .htaccess

Ervan uitgaande dat je mooie permalinks op je Instellingen -> Permalinks-pagina (zie de Codex voor minimumvereisten - voor WordPress op Nginx-servers is deze plug-in mogelijk gemaakt) hebt ingeschakeld, begint het proces met de .htaccess het dossier. Het speelt een eenvoudige en toch belangrijke rol. WordPress bevat iets dat lijkt op het volgende in dit bestand:

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

Dit controleert eenvoudig of het bestand of de map echt bestaat - en als dat het geval is, wordt u daar gewoon naartoe gebracht. Bijvoorbeeld:

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

Zou u gewoon de PNG-bijlage meenemen 'mijn-picture.png'. Maar zoals in het geval van:

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

Waar de directory niet bestaat - u wordt naar uw WordPress gebracht index.php het dossier. Het is dit bestand dat WordPress opstart.

De URL interpreteren

Op dit moment weet WordPress nog niet wat je zoekt. Na een eerste keer laden van WordPress en de bijbehorende instellingen, wordt de parse_request methode van de WP klasse (gelokaliseerd in de class-wp.php het dossier). Het is deze methode die de / Portoflio / wordpress / my-fancy-plugin en converteert het in een WordPress-begrijpbaar query-object (bijna, het stelt eigenlijk de query_vars array en daarna $ WP-> query_posts verandert dit in een zoekopdracht).

In het kort vergelijkt deze functie de ontvangen URL (/ Portoflio / wordpress / my-fancy-plugin) met een reeks 'reguliere expressies'. Dit is de array herschrijven - en het zal er ongeveer zo uitzien:

 category /(.+?)/ page /? ([0-9] 1,) /? $ => index.php? category_name = $ komt overeen met [1] & paged = $ komt overeen met [2] categorie /(.+ ?) /? $ => index.php? category_name = $ komt overeen met [1] tag / ([^ /] +) / page /? ([0-9] 1,) /? $ => index.php ? tag = $ overeenkomsten [1] & paged = $ overeenkomsten [2] tag / ([^ /] +) /? $ => index.php? tag = $ overeenkomsten [1] ([0-9] 4) / ([0-9] 1,2) / ([0-9] 1,2) /? $ => Index.php? Jaar = $ overeenkomsten [1] & maandnum = $ overeenkomsten [2] & dag = $ komt overeen met [3] (. +?) (/ [0-9] +)? /? $ => index.php? pagename = $ matches [1] & page = $ matches [2]

De sleutels van deze array zijn reguliere expressies en de ontvangen URL wordt om en om met elkaar vergeleken totdat er een overeenkomst is met het patroon van de ontvangen URL. De bijbehorende waarde is hoe de URL wordt geïnterpreteerd. De $ wedstrijden array bevat de vastgelegde waarden (geïndexeerd van 1) van de matching.

Bezoeken bijvoorbeeld www.example.com/blog/tag/my-tag, WordPress zoekt naar het eerste patroon dat overeenkomt met 'tag / my-tag'. Met de bovenstaande array komt het overeen met het derde patroon: tag / ([^ /] +) /? $. Dit vertelt WordPress om de URL te interpreteren als www.example.com/blog/index.php?tag=my-tag en dienovereenkomstig de 'mijn-tag'archief wordt geserveerd.

Natuurlijk laat WordPress je deze array aanpassen, en de rest van deze tutorial is erop gericht je te laten zien hoe.


De herschrijfregels aanpassen

Instellingen -> Permalinks

Uw eerste aanloophaven zou de 'Permalink'-instellingenpagina moeten zijn. Op deze pagina kun je de regels wijzigen voor de standaard 'post'berichttype en'categorie'en'labels'taxonomieën. De 'standaard'-optie heeft mooie permalinks uitgeschakeld, maar u kunt kiezen uit een lijst met vooraf ingestelde structuren of een aangepaste structuur maken. Houd er rekening mee dat aangepaste structuren uw site-URL niet mogen bevatten. WordPress stelt je in staat om je permalink-structuur te veranderen door meegeleverde tags toe te voegen, zoals % Postname% (de naam van het bericht), %jaar% (het jaar waarin het bericht is gepubliceerd) en %schrijver% (de auteur van de post). Een permalink-structuur zoals:

/% Jaar% /% auteur% /% postname% /

Zou een berichtlink maken zoals:

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

De documentatie voor deze opties is te vinden in de WordPress Codex. (Later laat ik u zien hoe u uw eigen aangepaste tags maakt).

De aangeboden opties zijn echter vrij beperkt. In deze tutorial zal ik me richten op de functies van WordPress die meer controle bieden over permalink-structuren en hoe deze worden geïnterpreteerd. Ik zal de herschrijfopties die beschikbaar zijn voor aangepaste berichttypen of taxonomieën niet afdekken, omdat dit in deel 2 wordt behandeld.

Waarom de herschrijfregels doorspoelen?

Na elke wijziging in de herschrijfregels (bijvoorbeeld door een van de volgende methoden te gebruiken, of door een aangepast berichttype of een taxonomie te registreren), kan het zijn dat de nieuwe regels niet van kracht worden. Dit komt omdat je de regels voor herschrijven moet doorspoelen. Dit kan op twee manieren worden gedaan:

  • Ga eenvoudig naar de pagina Instellingen -> Permalink
  • telefoontje flush_rewrite_rules () (gedekt in deel 2)

Wat doet dit? Bedenk dat het parse_request methode vergelijkt het verzoek met een herschrijfarray. Deze array leeft in de database. Het doorspoelen van de herschrijfregels werkt de database bij om uw wijzigingen weer te geven - en totdat u dit doet, worden ze niet herkend. Maar parse_request ook schrijft naar de .htaccess het dossier. Dit maakt het een dure operatie. Dus, hoewel ik het gebruik van flush_rewrite_rules () tot deel 2, zal ik je deze waarschuwing geven: Bel niet flush_rewrite_rules op elke pagina laden. Plug-ins mogen dit alleen oproepen als de plug-in is geactiveerd en gedeactiveerd.

Voeg herschrijfregel toe

De add_rewrite_rule kunt u extra regels toevoegen aan de herschrijfarray. Deze functie accepteert drie argumenten:

  • regel - een reguliere expressie waarmee de aanvraag-URL kan worden vergeleken
  • herschrijven - de querystring die wordt gebruikt om de regel te interpreteren. De $ wedstrijden array bevat de vastgelegde matches en start vanaf index '1'.
  • positie - 'top'of'bodem'. Waar de regel te plaatsen: bovenaan de herschrijfserie of onderaan. WordPress scant vanaf de top van de array naar de onderkant en stopt zodra er een overeenkomst wordt gevonden. Om ervoor te zorgen dat uw regels voorrang hebben op bestaande regels, moet u dit instellen op 'top'. Standaard is 'bodem'.

Notitie: als je gebruikt add_rewrite_rule meerdere keren, elk met positie 'top' - de eerste oproep heeft voorrang op volgende oproepen.

Laten we aannemen dat onze berichten een bijbehorende evenementdatum hebben en we willen deze structuur hebben: www.example.com/blog/the-olympics-begin/2012-07-27 geïnterpreteerd als www.example.com/blog/index.php?postname=the-olympics-begin&eventdate=2012-07-27 dan kunnen we deze regel als volgt toevoegen:

 function wptuts_add_rewrite_rules () add_rewrite_rule ('^ ([^ /] *) / ([0-9] 4 - [0-9] 2 - [0-9] 2) /? $' / / String gevolgd door een schuine streep, gevolgd door een datum in de vorm '2012-04-21', gevolgd door een andere schuine streep 'index.php? Pagename = $ overeenkomsten [1] & eventdate = $ overeenkomsten [2]', 'bovenaan' );  add_action ('init', 'wptuts_add_rewrite_rules');

Het volgende zou interpreteren www.example.com/olympics/2012/rowing zoals www.example.com/index.php?p=17&olymyear=2012&game=rowing

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

Als u niet zeker bent van uw reguliere expressies, vindt u deze introductie en deze tool misschien handig.

Herschrijftag toevoegen

Je denkt misschien dat de waarde van EVENTDATE (2012-07-27 in het bovenstaande voorbeeld), olymyear en spel kan toegankelijk zijn via de internets van WordPress via de get_query_var (op dezelfde manier dat get_query_var ( 'opgeroepen') krijgt het paginanummer waarop u zich bevindt). WordPress herkent de variabele echter niet automatisch EVENTDATE ook al wordt het geïnterpreteerd als een GET-variabele. Er zijn een aantal manieren om WordPress aangepaste variabelen te laten herkennen. Een daarvan is om de query_vars filter zoals aangetoond in het gedeelte 'Aangepaste eindpunt toevoegen' hieronder. Als alternatief kunnen we een stap verder gaan en gebruiken add_rewrite_tag om een ​​aangepaste tag te registreren zoals de standaard % Postname% en %jaar%

Deze functie accepteert drie argumenten:

  • tag naam - (met voorloop- en volg%), bijvoorbeeld: % EVENTDATE%
  • regex - Reguliere expressie om de waarde te valideren, b.v. '([0-9] 4 - [0-9] 2 - [0-9] 2)'
  • vraag - (optioneel) Hoe het label wordt geïnterpreteerd, b.v. 'EVENTDATE ='. Indien opgegeven, moet eindigen met een '='.
 functie wptuts_register_rewrite_tag () add_rewrite_tag ('% eventdate%', '([0-9] 4 - [0-9] 2 - [0-9] 2)');  add_action ('init', 'wptuts_ registration_rewrite_tag');

Niet alleen zal get_query_var ( 'EVENTDATE') retourneer de waarde van de datum in de URL, maar u kunt de tag gebruiken % EVENTDATE% in de Instellingen -> Permalink (samen met de standaardinstelling %jaar%, % Postname% etc.) en WordPress interpreteert het correct. helaas bij het genereren van de permalink van een bericht, weet WordPress niet hoe te vervangen % EVENTDATE% met de juiste waarde: dus onze post-permalinks eindigen als:

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

We moeten vervangen % EVENTDATE% met een passende waarde, en we kunnen dit doen met behulp van de post_link filter. (In dit voorbeeld neem ik aan dat de waarde is opgeslagen in een aangepast veld 'EVENTDATE').

 functie wp_tuts_filter_post_link ($ permalink, $ post) // Controleer of de% eventdate% tag aanwezig is in de url: if (false === strpos ($ permalink, '% eventdate%')) return $ permalink; // Haal de datum van het evenement opgeslagen in post meta $ event_date = get_post_meta ($ post-> ID, 'eventdate', true); // Helaas, als er geen datum wordt gevonden, moeten we een 'standaardwaarde' opgeven. $ event_date = (! empty ($ event_date)? $ event_date: '2012-01-01'); $ event_date = urlencode ($ event_date); // Vervang '% eventdate%' $ permalink = str_replace ('% eventdate%', $ event_date, $ permalink); return $ permalink;  add_filter ('post_link', 'wp_tuts_filter_post_link', 10, 2);

In deel 2 van deze serie zal ik aangepaste tags voor aangepaste berichttypes behandelen.

Voeg aangepast eindpunt toe

Eindpunten zijn tags die aan de URL zijn toegevoegd (/ Trackback / [value] is de meest voorkomende). Het heeft verschillende andere mogelijke toepassingen: verschillende sjablonen weergeven, afhankelijk van de ingestelde waarde, aangepaste meldingen en berichten in verschillende 'indelingen' (afdrukbaar, XML, JSON enz.).

U kunt eindpunten maken met add_rewrite_endpoint. Deze functie accepteert twee argumenten:

  • naam - De naam van het eindpunt, b.v. 'json','het formulier', enz.
  • waar - Eindpuntmasker geeft aan waar het eindpunt moet worden toegevoegd. Dit moet een van de onderstaande EP_ * -constanten zijn (of een combinatie die bitwise-operators gebruikt). Wanneer u aangepaste berichttypen registreert, kunt u een masker voor dat berichttype maken:

De standaard eindpuntmaskers zijn:

  • EP_PERMALINK - voor post-permalinks
  • EP_ATTACHMENT - voor bijlagen
  • EP_DATE - voor datumarchieven
  • EP_YEAR - voor jaararchieven
  • EP_MONTH - voor maandarchieven
  • EP_DAY - voor 'dag' archieven
  • EP_ROOT - voor de hoofdmap van de site
  • EP_COMMENTS - voor opmerkingen
  • EP_SEARCH - voor zoekopdrachten
  • EP_CATEGORIES - voor categorieën
  • EP_TAGS - voor tags
  • EP_AUTHORS - voor archief van auteursposten
  • EP_PAGES - voor pagina's
  • EP_ALL - voor alles

Eindpunten zijn uiterst flexibel, u kunt ze gebruiken met bitwise-operators, dus u kunt bijvoorbeeld een eindpunt toevoegen aan post-en pagina-permalinks met EP_PERMALINK | EP_PAGES.

 functie wptuts_add_endpoints () add_rewrite_endpoint ('myendpoint', EP_PERMALINK); // Voegt eindpunt toe aan permalinks add_rewrite_endpoint ('anotherendpoint', EP_AUTHORS | EP_SEARCH); // Voegt eindpunt toe aan urls voor auteurs of zoekresultaten add_action ('init', 'wptuts_add_endpoints');

Als een kort voorbeeld kunnen eindpunten nuttig zijn voor het indienen van formulieren. Stel dat we een pagina met een contactformulier met naam hebben Contact Formulier en met permalink: www.example.com/contact en wil de URL's:

  • www.example.com/contact/submission/success - om een ​​succesvolle formulierinzending weer te geven
  • www.example.com/contact/submission/error - om een ​​niet-succesvolle formulierindiening weer te geven

Dit kan gedaan worden met eindpunten. Het volgende is een heel eenvoudig voorbeeld van het gebruik van eindpunten, en dus is de vorm ongelooflijk basaal in zijn controles (en doet in feite niets met de gegevens). Normaal zou een formulier als dit het beste werken in een plug-in, met behulp van shortcodes - maar maak voor de doeleinden van dit voorbeeld een pagina met de volgende sjabloon en de rest van de code die u in uw functions.php

 

Mijn eenvoudig contactformulier

Je bericht is verzonden!
Oops! Er lijkt een fout te zijn ...

(In het geval u zich afvraagt, verwijst de honing naar deze zeer basismethode voor het vangen van spam die hier wordt beschreven. Het is zeker geen dwaallicht, maar de juiste formulierverwerking en spambescherming staan ​​hier niet ter discussie). Nu maken we ons eindpunt:

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

Vervolgens voegen we onze 'het formulier'variabel in de reeks van herkende variabelen:

 functie wptuts_add_queryvars ($ query_vars) $ query_vars [] = 'formulier'; return $ query_vars;  add_filter ('query_vars', 'wptuts_add_queryvars');

Ten slotte bieden we een formulierhandler aan, die de gegevens verwerkt, het formulier verzendt en vervolgens omleidt naar de contactpagina met de relevante eindpuntwaarde toegevoegd.

 function wptuts_form_handler () // Willen we het formulier verwerken als (! isset ($ _POST ['action']) || 'wptuts_send_message'! = $ _POST ['action']) terugkomt; // ID van de pagina met contactformulieren $ form_id = 2163; $ redirect = get_permalink ($ form_id); // Controleer nonces $ data = $ _POST ['wptuts_contact']; if (! isset ($ _ POST ['wptuts_contact_nonce']) ||! wp_verify_nonce ($ _ POST ['wptuts_contact_nonce'], 'wptuts_send_message')) // Failed nonce check $ redirect. = 'form / error'; wp_redirect ($ redirect); Uitgang();  if (! empty ($ data ['confirmation'])) // Bijen in de honing ... $ redirect. = 'vorm / fout'; wp_redirect ($ redirect); Uitgang();  // Santize en valideer data enz. // Doe dan daadwerkelijk iets met de gedesinfecteerde gegevens // Succesvol! $ redirect. = 'vorm / succes'; wp_redirect ($ redirect); Uitgang();  add_action ('init', 'wptuts_form_handler');

Natuurlijk kan zelfs dit voorbeeld aanzienlijk worden verbeterd door meer gedetailleerde foutmeldingen te geven die de reden voor het falen overbrengen.

Een aangepaste feed toevoegen

Met mooie permalinks ingeschakeld, produceert WordPress automatisch mooie URL's voor de feed van uw site: www.example.com/feed/rss. De add_feed Met de functie kunt u een aangepaste feed maken die, als mooie permalinks zijn ingeschakeld, ook een 'mooie' URL heeft. Deze functie accepteert twee argumenten:

  • voer naam - De naam van de feed zoals deze wordt weergegeven voer / [feed-name]
  • feed callback - De functie die verantwoordelijk is voor het weergeven van de inhoud van de feed.

Het volgende is bedoeld als een voorbeeld van add_feed, en biedt een zeer standaard aangepaste feed.

 function 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 "), waar); echo ''; ?>   Mijn aangepaste feed     have_posts ()):?> have_posts ()): $ custom_feed-> the_post (); ?>  <?php the_title_rss() ?>    ]]>       

Na het doorspoelen van de permalinks is de feed beschikbaar op www.example.com/feed/events.


De herschrijfregels controleren

Nadat je enkele van je eigen herschrijfregels hebt toegevoegd (en ze hebt doorgespoeld), wil je waarschijnlijk controleren of ze goed werken - en als dat niet het geval is, ontdek dan wat er mis gaat. Hiervoor heb ik de Monkeyman Rewrite Analyzer plug-in sterk aanbevolen, een gratis plug-in die beschikbaar is in de WordPress repository. Eenmaal geactiveerd, voegt deze plug-in een pagina toe aan uw 'Tools' sectie, die al uw herschrijfregels opsomt.

U kunt de regels ook testen door deze een voorbeeld-URL te geven en de plug-in filtert de regels om alleen overeenkomende patronen weer te geven en aan te geven hoe WordPress de URL zou interpreteren.

Veel plezier en ga binnenkort naar Deel 2!

Let op: Er zit momenteel een bug in onze syntaxis-markeerstift die wordt weergegeven "leeg()" zoals "emptyempty ()Vergeet niet om uw code aan te passen.