The Rewrite API The Basics

Questa è la prima parte di una serie in due parti che esamina l'API Rewrite di WordPress. In questo tutorial esaminiamo come funzionano le riscritture e i metodi di base disponibili per creare regole di riscrittura personalizzate.


Che cos'è la riscrittura?

WordPress, come tutti i sistemi di gestione dei contenuti, decide quali contenuti visualizzare in base alle variabili (di solito chiamate variabili di interrogazione) gli vengono passati. Per esempio: http://example.com/index.php?category=3 dice a WordPress che siamo post in una categoria con ID 3 e http://example.com/index.php?feed=rss dice a WordPress che vogliamo il feed del sito in formato RSS.

Purtroppo questo può lasciarci con URL piuttosto brutti:

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

È qui che entra in gioco la riscrittura di WordPress. Ci consente di sostituire quanto sopra con:

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

Che ora non è solo più leggibile (e memorabile), ma anche più SEO friendly. Questo è, in poche parole, cosa fa la riscrittura.


Come funziona?

Adesso http://example.com/portoflio/wordpress/my-fancy-plugin non esiste come directory o file. Quindi, come WordPress offre i contenuti corretti? Quando WordPress riceve un "bel permalink" come sopra, ha bisogno di convertirlo in qualcosa che capisce, cioè a oggetto di query. Più semplicemente deve prendere l'URL carino e mappare le parti appropriate alla variabile di query corretta. Quindi per il nostro esempio:

http://example.com/portoflio/wordpress/my-fancy-plugin
  • post_type è impostato su 'portfolio'
  • portafoglio-tassonomia è impostato su 'wordpress'
  • portafoglio è impostato su 'my-fancy-plugin' (il nome del post)

Quindi WordPress sa che stiamo cercando post di tipo 'portafoglio', nel 'wordpress"portafoglio-tassonomia'termine tassonomia con nome'my-fantasia-plugin'. (Come avrai intuito, i primi due sono in realtà ridondanti). WordPress quindi esegue quella query, sceglie il modello appropriato con cui visualizzare i risultati e poi li fornisce al visualizzatore. Ma chiaramente WordPress non indovina solo come interpretare gli URL, deve essere detto ...

Inizia con .htaccess

Supponendo che tu possa aver abilitato i permalink piuttosto sulla tua pagina Impostazioni -> Permalinks (vedi il Codex per i requisiti minimi - per WordPress sui server Nginx c'è questo plug-in) - allora le cose iniziano con .htaccess file. Svolge un ruolo semplice ma significativo. WordPress include qualcosa di simile al seguente in questo file:

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

Questo semplicemente controlla se il file o la directory esiste realmente e se lo fa, vieni semplicemente portato lì. Per esempio:

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

Ti porterei semplicemente l'allegato PNG 'my-picture.png'. Ma, come nel caso di:

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

Dove la directory non esiste - sei portato al tuo WordPress ' index.php file. È questo file che avvia WordPress.

Interpretazione dell'URL

A questo punto, WordPress non sa ancora cosa stai cercando. Dopo un po 'di caricamento iniziale di WordPress e delle sue impostazioni, spara il parse_request metodo del WP classe (situata nel class-wp.php file). È questo metodo che prende il / Portoflio / wordpress / my-fantasia-plugin e lo converte in un oggetto query comprensibile a WordPress (quasi, in realtà imposta il query_vars array e in seguito $ WP> query_posts trasforma questo in una query).

In breve, questa funzione confronta l'URL ricevuto (/ Portoflio / wordpress / my-fantasia-plugin) con una serie di 'espressioni regolari'. Questo è il riscrivi l'array - e assomiglierà a qualcosa del genere:

 categoria /(.+?)/ pagina /? ([0-9] 1,) /? $ => index.php? category_name = $ corrisponde a [1] & paged = $ corrisponde a [2] categoria /(.+ ?) /? $ => index.php? category_name = $ corrisponde a [1] tag / ([^ /] +) / page /? ([0-9] 1,) /? $ => index.php ? tag = $ corrisponde a [1] & paged = $ corrisponde a [2] tag / ([^ /] +) /? $ => index.php? tag = $ corrisponde a [1] ([0-9] 4) / ([0-9] 1,2) / ([0-9] 1,2) /? $ => Index.php? Year = $ corrisponde a [1] e monthnum = $ corrisponde a [2] e giorno = $ corrisponde a [3] (. +?) (/ [0-9] +)? /? $ => index.php? pagename = $ corrisponde a [1] & page = $ corrisponde a [2]

Le chiavi di questo array sono espressioni regolari e l'URL ricevuto viene confrontato a vicenda a turno fino a quando non vi è una corrispondenza con il modello dell'URL ricevuto. Il valore corrispondente è il modo in cui l'URL viene quindi interpretato. Il $ partite la matrice contiene i valori catturati (indicizzati da 1) dalla corrispondenza.

Ad esempio, visitando www.example.com/blog/tag/my-tag, WordPress cercherà il primo pattern che corrisponde a 'tag / my-tag'. Con l'array di cui sopra, corrisponde al terzo modello: tag / ([^ /] +) /? $. Questo dice a WordPress di interpretare l'URL come www.example.com/blog/index.php?tag=my-tag e corrispondentemente ilmy-tag'l'archivio è servito.

Naturalmente WordPress ti consente di personalizzare questo array e il resto di questo tutorial è dedicato a mostrarti come.


Personalizzazione delle regole di riscrittura

Impostazioni -> Permalink

La prima porta di chiamata dovrebbe essere la pagina delle impostazioni "Permalink". Questa pagina ti consente di modificare le regole per l'impostazione predefinita 'inviare'tipo di post, e'categoria' e 'tag' tassonomie. L'opzione 'default' ha disabilitato i permalink, ma puoi selezionare da una lista di strutture preimpostate o creare una struttura personalizzata. Si noti che le strutture personalizzate non devono contenere l'URL del sito. WordPress ti consente di modificare la struttura del permalink aggiungendo tag forniti come % Postname% (il nome del post), %anno% (l'anno in cui è stato pubblicato il post) e %autore% (l'autore del post). Una struttura di permalink come:

/% All'anno% /% autore% /% postname% /

Produrrebbe un collegamento post come:

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

La documentazione di queste opzioni è disponibile nel codice WordPress. (Più avanti ti mostrerò come creare i tuoi tag personalizzati).

Tuttavia, le opzioni fornite sono piuttosto limitate. In questo tutorial mi concentrerò sulle funzioni fornite da WordPress che offrono un maggiore controllo sulle strutture di permalink e su come vengono interpretate. Non coprirò le opzioni di riscrittura disponibili per i tipi di post personalizzati o tassonomie, in quanto ciò sarà trattato nella parte 2.

Perché flashare le regole di riscrittura?

Dopo eventuali modifiche alle regole di riscrittura (ad esempio, utilizzando uno dei seguenti metodi o registrando un tipo di post personalizzato o una tassonomia), è possibile che le nuove regole non abbiano effetto. Questo perché devi svuotare le regole di riscrittura. Questo può essere fatto in due modi:

  • Basta visitare la pagina Impostazioni -> Permalink
  • Chiamata flush_rewrite_rules () (coperto nella parte 2)

Cosa fa questo? Ricordiamo che il parse_request il metodo confronta la richiesta con un array di riscrittura. Questo array è presente nel database. Il risciacquo delle regole di riscrittura aggiorna il database in modo che rifletta le modifiche e, finché non lo fai, non verrà riconosciuto. Ma parse_request anche scrive al .htaccess file. Questo lo rende un'operazione costosa. Quindi, anche se non coprirò l'uso di flush_rewrite_rules () fino alla parte 2, ti darò questo avvertimento: Non chiamare flush_rewrite_rules su ogni pagina caricata. I plug-in dovrebbero chiamarlo solo quando il plug-in è attivato e disattivato.

Aggiungi regola di riscrittura

Il add_rewrite_rule ti consente di aggiungere regole aggiuntive all'array di riscrittura. Questa funzione accetta tre argomenti:

  • regola - un'espressione regolare con cui confrontare l'URL della richiesta
  • riscrivere - la stringa di query utilizzata per interpretare la regola. Il $ partite la matrice contiene le partite catturate e inizia dall'indice '1'.
  • posizione - 'superiore' o 'parte inferiore'. Dove posizionare la regola: nella parte superiore della matrice di riscrittura o in basso. WordPress esegue la scansione dalla parte superiore dell'array verso il basso e si ferma non appena trova una corrispondenza. Affinché le tue regole abbiano la precedenza sulle regole esistenti, ti consigliamo di impostarle susuperiore'. L'impostazione predefinita è 'parte inferiore'.

Nota: se usi add_rewrite_rule più volte, ognuna con posizione 'superiore' - il primo la chiamata ha la precedenza sulle chiamate successive.

Supponiamo che i nostri post abbiano una data evento associata a loro e vogliamo avere questa struttura: www.example.com/blog/the-olympics-begin/2012-07-27 interpretato come www.example.com/blog/index.php?postname=the-olympics-begin&eventdate=2012-07-27 quindi possiamo aggiungere questa regola come segue:

 function wptuts_add_rewrite_rules () add_rewrite_rule ('^ ([^ /] *) / ([0-9] 4 - [0-9] 2 - [0-9] 2) /? $' / / Stringa seguita da una barra, seguita da una data nella forma '2012-04-21', seguita da un'altra barra 'index.php? Pagename = $ corrisponde a [1] e eventdate = $ corrisponde a [2]', 'top' );  add_action ('init', 'wptuts_add_rewrite_rules');

Ciò che segue dovrebbe interpretare www.example.com/olympics/2012/rowing come www.example.com/index.php?p=17&olymyear=2012&game=rowing

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

Se non sei sicuro delle tue espressioni regolari, potresti trovare questa introduzione e questo strumento utile.

Aggiungi tag Rewrite

Potresti pensare che il valore di data dell'evento (2012-07-27 nell'esempio sopra), olymyear e gioco può essere accessibile dagli interni di WordPress tramite il get_query_var (nello stesso modo in cui get_query_var ( 'paging') ottiene il numero di pagina in cui ti trovi). Tuttavia, WordPress non riconosce automaticamente la variabile data dell'evento anche se è interpretato come una variabile GET. Ci sono un paio di modi per far riconoscere a WordPress variabili personalizzate. Uno è usare il query_vars filtrare come illustrato nella sezione "Aggiungi endpoint personalizzati" di seguito. In alternativa, possiamo fare un ulteriore passo avanti e utilizzare add_rewrite_tag per registrare un tag personalizzato come predefinito % Postname% e %anno%

Questa funzione accetta tre argomenti:

  • nome del tag - (con percentuale iniziale e finale) ad esempio: %data dell'evento%
  • regex - Espressione regolare per convalidare il valore, ad es. '([0-9] 4 - [0-9] 2 - [0-9] 2)'
  • domanda - (facoltativo) Come viene interpretato il tag, ad es. 'EVENTDATE ='. Se fornito, deve terminare con un '='.
 function wptuts_register_rewrite_tag () add_rewrite_tag ('% eventdate%', '([0-9] 4 - [0-9] 2 - [0-9] 2)');  add_action ('init', 'wptuts_register_rewrite_tag');

Non solo volontà get_query_var ( 'EVENTDATE') restituire il valore della data nell'URL, ma è possibile utilizzare il tag %data dell'evento% in Impostazioni -> Permalink (insieme al valore predefinito %anno%, % Postname% ecc.) e WordPress interpreterà correttamente. Sfortunatamente quando si genera il permalink di un post, WordPress non sa come sostituire %data dell'evento% con il valore appropriato: così i nostri permalink post finiscono come:

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

Dobbiamo sostituire %data dell'evento% con un valore appropriato, e possiamo farlo usando il post_link filtro. (In questo esempio, assumerò che il valore sia memorizzato in un campo personalizzato 'data dell'evento').

 function wp_tuts_filter_post_link ($ permalink, $ post) // Controlla se il tag% eventdate% è presente nell'URL: if (false === strpos ($ permalink, '% eventdate%')) restituisce $ permalink; // Ottieni la data dell'evento memorizzata nel post meta $ event_date = get_post_meta ($ post-> ID, 'eventdate', true); // Sfortunatamente, se non viene trovata alcuna data, dobbiamo fornire un 'valore predefinito'. $ event_date = (! empty ($ event_date)? $ event_date: '2012-01-01'); $ event_date = urlencode ($ event_date); // Sostituisci '% eventdate%' $ permalink = str_replace ('% eventdate%', $ event_date, $ permalink); return $ permalink;  add_filter ('post_link', 'wp_tuts_filter_post_link', 10, 2);

Nella parte 2 di questa serie tratteremo i tag personalizzati per i tipi di post personalizzati.

Aggiungi endpoint personalizzato

Gli endpoint sono tag aggiunti all'URL (/ Trackback / [valore] è il più comune). Ha molti altri potenziali usi: visualizzazione di modelli diversi a seconda del set di valori, notifiche personalizzate e visualizzazione di messaggi in diversi "formati" (stampabili, XML, JSON, ecc.).

È possibile creare endpoint con add_rewrite_endpoint. Questa funzione accetta due argomenti:

  • nome - Il nome dell'endpoint, ad es. 'jSON','modulo', eccetera.
  • dove - Maschera endpoint che specifica dove deve essere aggiunto l'endpoint. Questa dovrebbe essere una delle costanti EP_ * elencate di seguito (o una combinazione che utilizza operatori bit a bit). Quando registri tipi di post personalizzati puoi creare una maschera per quel tipo di post:

Le maschere di endpoint predefinite sono:

  • EP_PERMALINK - per post permalink
  • EP_ATTACHMENT - per gli allegati
  • EP_DATE - per gli archivi di date
  • EP_YEAR - per gli archivi annuali
  • EP_MONTH - per gli archivi del mese
  • EP_DAY - per gli archivi "giorno"
  • EP_ROOT - per la radice del sito
  • EP_COMMENTS - per commenti
  • EP_SEARCH - per le ricerche
  • EP_CATEGORIES - per categorie
  • EP_TAGS - per i tag
  • EP_AUTHORS - per l'archivio dei post dell'autore
  • EP_PAGES - per le pagine
  • EP_ALL - per tutto

Gli endpoint sono estremamente flessibili, è possibile utilizzarli con operatori bit a bit quindi, ad esempio, è possibile aggiungere un endpoint per pubblicare e i permalink delle pagine con EP_PERMALINK | EP_PAGES.

 function wptuts_add_endpoints () add_rewrite_endpoint ('myendpoint', EP_PERMALINK); // Aggiunge endpoint ai permalink add_rewrite_endpoint ('anotherendpoint', EP_AUTHORS | EP_SEARCH); // Aggiunge endpoint agli URL per autori o risultati di ricerca add_action ('init', 'wptuts_add_endpoints');

Come un breve esempio, gli endpoint possono essere utili per l'invio di moduli. Supponiamo di avere una pagina del modulo di contatto con il nome Modulo di Contatto e con permalink: www.example.com/contact e vogliono gli URL:

  • www.example.com/contact/submission/success - per riflettere una presentazione del modulo riuscita
  • www.example.com/contact/submission/error - per riflettere una sottomissione di modulo non riuscita

Questo può essere fatto con gli endpoint. Quello che segue è un esempio molto semplice di come usare gli endpoint, e quindi la forma è incredibilmente semplice nei suoi controlli (e di fatto non fa nulla con i dati). Normalmente una forma come questa funzionerebbe al meglio in un plug-in, usando i codici brevi, ma ai fini di questo esempio, crea una pagina con il seguente modello e il resto del codice che puoi inserire nella tua functions.php

 

Il mio semplice modulo di contatto

Il vostro messaggio è stato inviato!
Oops! Sembra che ci sia stato un errore ...

(Nel caso ve lo stiate chiedendo, il miele si riferisce a questo metodo molto basilare per catturare lo spam qui delineato. Non è certamente infallibile, ma l'elaborazione corretta dei moduli e la protezione dallo spam sono fuori tema qui). Ora creiamo il nostro endpoint:

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

Successivamente aggiungiamo il nostro 'modulo'variabile alla matrice di variabili riconosciute:

 function wptuts_add_queryvars ($ query_vars) $ query_vars [] = 'form'; return $ query_vars;  add_filter ('query_vars', 'wptuts_add_queryvars');

Infine forniamo un gestore di moduli, che elaborerà i dati, invierà il modulo e quindi reindirizzerà alla pagina di contatto con il valore dell'endpoint pertinente aggiunto.

 function wptuts_form_handler () // Stiamo cercando di elaborare il modulo se (! isset ($ _POST ['action']) || 'wptuts_send_message'! = $ _POST ['action']) restituisce; // ID della pagina del modulo di contatto $ form_id = 2163; $ redirect = get_permalink ($ form_id); // Controlla nonces $ data = $ _POST ['wptuts_contact']; if (! isset ($ _ POST ['wptuts_contact_nonce']) ||! wp_verify_nonce ($ _ POST ['wptuts_contact_nonce'], 'wptuts_send_message')) // Fallimento nonce check $ redirect. = 'form / error'; wp_redirect ($ redirect); Uscita();  if (! empty ($ data ['confirm'])) // Api nel miele ... $ redirect. = 'form / error'; wp_redirect ($ redirect); Uscita();  // Sollecita e convalida i dati, ecc. // Quindi esegui effettivamente qualcosa con i dati disinfettati // Riuscito! $ redirect. = 'form / success'; wp_redirect ($ redirect); Uscita();  add_action ('init', 'wptuts_form_handler');

Ovviamente anche questo esempio potrebbe essere notevolmente migliorato fornendo messaggi di errore più dettagliati che veicolano il motivo del fallimento.

Aggiunta di un feed personalizzato

Con i permalink piuttosto permessi, WordPress produce automaticamente URL carini per il feed del tuo sito: www.example.com/feed/rss. Il add_feed funzione consente di creare un feed personalizzato, che se sono abilitati i permalink piuttosto belli, avrà anche un URL "carino". Questa funzione accetta due argomenti:

  • nome del feed - Il nome del feed così come apparirà in Feed / [feed-name]
  • feed richiamo - La funzione responsabile della visualizzazione dei contenuti del feed.

Il seguente è inteso come un esempio di add_feed, e fornisce un feed personalizzato molto semplice.

 function wptuts_events_feed_callback () $ custom_feed = new WP_Query (array ('meta_key' => 'eventdate')); intestazione ('Content-Type:'. feed_content_type ('rss-http'). '; charset = ". get_option (" blog_charset'), true); eco ''; ?>   Il mio feed personalizzato     have_posts ()):?> have_posts ()): $ custom_feed-> the_post (); ?>  <?php the_title_rss() ?>    ]]>       

Dopo aver sciacquato i permalink, il feed sarà disponibile su www.example.com/feed/events.


Controllo delle regole di riscrittura

Una volta che hai aggiunto alcune delle tue regole di riscrittura (e le hai svuotate), probabilmente vorrai controllare se funzionano correttamente - e se non lo sono, scopri cosa non funziona. Per questo, ho fortemente raccomandato il plug-in Monkeyman Rewrite Analyzer, un plug-in gratuito disponibile nel repository di WordPress. Una volta attivato, questo plug-in aggiunge una pagina alla sezione 'Strumenti', che elenca tutte le regole di riscrittura.

Puoi anche testare le regole assegnandole un URL di esempio e il plug-in filtrerà le regole per mostrare solo i pattern corrispondenti e indicando come WordPress interpreterà l'URL.

Divertiti e tieni d'occhio la Parte 2, in arrivo!

Nota: attualmente c'è un bug nel nostro evidenziatore di sintassi che mostra "vuoto()" come "emptyempty ()". Non dimenticare di adattare il tuo codice di conseguenza.