Aceasta este o parte dintr-o serie de două părți privind WordPress 'Rewrite API. În acest tutorial ne uităm la modul în care rescrierile funcționează și la metodele de bază disponibile pentru a crea reguli personalizate de rescriere.
WordPress, la fel ca toate sistemele de gestionare a conținutului, decide ce conținut trebuie afișat pe baza variabilelor (denumite în mod obișnuit variabile de interogare) care le sunt transmise. De exemplu: http://example.com/index.php?category=3
spune WordPress că suntem după posturi într - o categorie cu un ID de 3 și http://example.com/index.php?feed=rss
spune WordPress că vrem feed-ul site-ului în format RSS.
Din nefericire, acest lucru ne poate lăsa cu URL-uri destul de urâte:
http://example.com/index.php?post_type=portfolio&taxonomy=wordpress&portfolio=my-fancy-plugin
Aici procedeaza rescrierea WordPress. El ne permite sa inlocuim cele de mai sus cu:
http://example.com/portoflio/wordpress/my-fancy-plugin
Care este acum nu numai mult mai ușor de citit (și memorabil), dar și mai prietenos SEO. Aceasta este, pe scurt, ceea ce face rescrierea.
Acum http://example.com/portoflio/wordpress/my-fancy-plugin
nu există ca un director sau un fișier. Deci cum funcționează WordPress conținutul corect? Atunci când WordPress primește un "destul de permalink", cum ar fi cele de mai sus, trebuie să îl convertiți în ceva pe care îl înțelege, și anume a interogare obiect. Mai simplu, trebuie să luați URL-ul bun și să cartografiați părțile corespunzătoare la variabila corectă de interogare. Deci, pentru exemplul nostru:
http://example.com/portoflio/wordpress/my-fancy-plugin
post_type
este setat la "portofoliu"Portofoliul-taxonomie
este setat la "wordpress"portofoliul
este setat la "my-fancy-plugin" (numele postului)Apoi, WordPress știe că suntem după posturi de tip "portofoliul
', în 'wordpress
"Portofoliul-taxonomie
"termen de taxonomie cu nume"mi-fantezie-plugin
“. (După cum probabil ați ghicit, primele două sunt de fapt redundante). WordPress efectuează apoi acea interogare, alege șablonul corespunzător cu care să afișeze rezultatele și apoi îl servește pentru vizualizator. Cu toate acestea WordPress în mod clar nu doar ghici cum să interpreteze URL-urile, trebuie să fie spus ...
Presupunând că puteți și ați activat destul de multe permalinks pe pagina dvs. Settings -> Permalinks (consultați Codex pentru cerințele minime - pentru serverele WordPress pe serverele Nginx există acest plug-in) - atunci lucrurile încep cu .htaccess
fişier. Acesta joacă un rol simplu și totuși semnificativ. WordPress include ceva similar cu următorul text în acest fișier:
# BEGIN WordPressRewriteEngine pe RewriteBase / RewriteRule ^ index \ .php $ - [L] RewriteCond% REQUEST_FILENAME! -F RewriteCond% REQUEST_FILENAME! -D RewriteRule. /index.php [L] # END WordPress
Acest lucru verifică pur și simplu dacă fișierul sau directorul există în realitate - și dacă este cazul, pur și simplu sunteți luați acolo. De exemplu:
http://example.com/blog/wp-content/uploads/2012/04/my-picture.png
V-ar purta simplu atașamentul PNG "mi-picture.png“. Dar, ca și în cazul:
http://example.com/blog/portoflio/wordpress/my-fancy-plugin
În cazul în care directorul nu există - sunteți duși la WordPress " index.php fişier. Este acest fișier care lansează WordPress.
În acest moment, WordPress nu știe încă ce căutați. După o încărcare inițială a WordPress și a setărilor sale, acesta declanșează parse_request
metodă a WP
clasă (localizată în clasa-wp.php fişier). Aceasta este metoda pe care o ia / Portoflio / WordPress / my-fantezie-plugin
și o transformă într-un obiect de interogare WordPress-interogabil (aproape, de fapt, stabilește query_vars
și după aceea $ Wp-> query_posts
transformă acest lucru într-o interogare).
Pe scurt, această funcție compară adresa URL primită (/ Portoflio / WordPress / my-fantezie-plugin
) cu o serie de "expresii regulate". Acesta este rescrie matricea - si va arata cam asa:
Categoria /(./?)/ pagina /? ([0-9] 1,) /? $ => index.php? category_name = $ meciuri [1] & paged = $ meciuri [2] ?) /? $ => index.php? category_name = $ potriveste [1] tag / ([^ /] +) / page /? ([0-9] 1,)? ? tag = $ meciuri [1] & paged = $ meciuri [2] tag / ([^ /] +) /? $ => index.php? tag = $ matches [1] (0-9) 4 / [[0-9] 1,2) / ([0-9] 1,2) /? $ => Index.php? Year = $ meciuri [1] & monthnum = $ meciuri [2] & zi = $ meciuri [3] (. +?) (/ [0-9] +)? /? $ => index.php? pagename = $ meciuri [1] & page =
Cheile acestui matrice sunt expresii regulate, iar adresa URL primită este comparată cu fiecare, la rândul său, până când există o potrivire cu modelul adresei URL primite. Valoarea corespunzătoare este modul în care adresa URL este apoi interpretată. $ meciuri
array conține valorile capturate (indexate de la 1) din potrivire.
De exemplu, vizita www.example.com/blog/tag/my-tag
, WordPress va căuta primul model care se potrivește cu "tag / my-tag
“. Cu matricea de mai sus, se potrivește cu cel de-al treilea model: tag / ([^ /] +) /? $
. Acest lucru îi spune WordPress să interpreteze URL-ul ca fiind www.example.com/blog/index.php?tag=my-tag
și, în mod corespunzător,mi-tag-ul
"Arhiva este servită.
Desigur, WordPress vă permite să personalizați această matrice, iar restul acestui tutorial este dedicat să vă arătăm cum.
Primul dvs. port de apel trebuie să fie pagina de setări "Permalink". Această pagină vă permite să modificați regulile pentru opțiunea "post
"tip post și"categorie
' și 'Etichete
taxonomii. Opțiunea "implicită" are destul de permalinks dezactivată, dar puteți selecta dintr-o listă de structuri prestabilite sau puteți crea o structură personalizată. Rețineți că structurile personalizate nu trebuie să conțină adresa URL a site-ului dvs.. WordPress vă permite să vă modificați structura permalink adăugând etichete furnizate, cum ar fi % Postname%
(numele postului), %an%
(anul publicării postului) și %autor%
(autorul postului). O structură permalink cum ar fi:
/% An% /% autor% /% postname% /
Ar produce un link post, cum ar fi:
www.example.com/2012/stephen/my-post
Documentația pentru aceste opțiuni poate fi găsită în Codul WordPress. (Mai târziu, vă voi arăta cum să creați propriile etichete personalizate).
Cu toate acestea, opțiunile furnizate sunt destul de limitate. În acest tutorial mă voi concentra asupra funcțiilor oferite de WordPress care oferă un control mai mare asupra structurilor permalink și modul în care sunt interpretate. Nu voi acoperi opțiunile de rescriere disponibile pentru tipuri personalizate de posturi sau taxonomii, deoarece acestea vor fi acoperite în partea a doua.
După orice modificare a regulilor de rescriere (de exemplu, fie prin utilizarea uneia dintre metodele următoare, fie prin înregistrarea unui tip de post sau taxonomie personalizată), puteți constata că noile reguli nu au efect. Acest lucru se datorează faptului că trebuie să eliminați regulile de rescriere. Acest lucru se poate face fie în unul din două moduri:
flush_rewrite_rules ()
(acoperit în partea 2)Ce face asta? Rețineți că parse_request
metoda compară cererea împotriva unei matrice de rescriere. Această matrice trăiește în baza de date. Ștergerea regulilor de rescriere actualizează baza de date pentru a reflecta modificările dvs. - și până când faceți acest lucru, acestea nu vor fi recunoscute. Dar parse_request
de asemenea scrie la .htaccess
fişier. Acest lucru face o operațiune costisitoare. Deci, deși nu voi acoperi utilizarea flush_rewrite_rules ()
până în partea 2, vă voi da acest avertisment: Nu suna flush_rewrite_rules
la încărcarea fiecărei pagini. Plug-in-urile ar trebui să sune numai atunci când plug-in-ul este activat și dezactivat.
add_rewrite_rule
vă permite să adăugați reguli suplimentare la matricea de rescriere. Această funcție acceptă trei argumente:
$ meciuri
array conține potrivirile capturate și pornește de la indexul "1".top
"sau"fund
“. Unde să plasați regula: în partea de sus a matricei de rescriere sau în partea de jos. WordPress scanează din partea de sus a matricei spre partea de jos și se oprește de îndată ce găsește o potrivire. Pentru ca regulile dvs. să aibă prioritate față de regulile existente, veți dori să setați această regulă la "top
“. Implicit este "fund
'.Notă: dacă utilizați add_rewrite_rule
de mai multe ori, fiecare cu poziția "top
"- primul apelul are prioritate față de apelurile ulterioare.
Să presupunem că posturile noastre au o dată eveniment asociată cu ele și dorim să avem această structură: www.example.com/blog/the-olympics-begin/2012-07-27
interpretat ca www.example.com/blog/index.php?postname=the-olympics-begin&eventdate=2012-07-27
atunci putem adăuga această regulă după cum urmează:
funcția wptuts_add_rewrite_rules () add_rewrite_rule ('^ ([^ /] *) / ([0-9] 4 - [0-9] 2 / String urmat de o slash, urmată de o dată în formularul '2012-04-21', urmată de un alt slash 'index.php? Pagename = $ matches [1] & eventdate = $ matches [2]', ); add_action ('init', 'wptuts_add_rewrite_rules');
Următoarele ar interpreta www.example.com/olympics/2012/rowing
la fel de www.example.com/index.php?p=17&olymyear=2012&game=rowing
add_rewrite_rule ('^ olympics / ([0-9] 4) / ([^ /] *)', 'index.php? p = 17 & olymyear = top ');
Dacă nu sunteți sigur de expresiile dvs. regulate, puteți găsi această introducere și acest instrument util.
S-ar putea să credeți că valoarea lui data evenimentului
(2012-07-27 în exemplul de mai sus), olymyear
și joc
pot fi accesibile din interiorul WordPress prin intermediul get_query_var
(în același mod ca și get_query_var ( 'paginat')
primește numărul paginii pe care vă aflați). Cu toate acestea, WordPress nu recunoaște automat variabila data evenimentului
chiar dacă este interpretată ca o variabilă GET. Există câteva moduri de a face WordPress să recunoască variabile personalizate. Unul este de a folosi query_vars
filtru, după cum se arată în secțiunea "Adăugați punctul de lucru personalizat" de mai jos. În mod alternativ, putem merge mai departe și utilizați add_rewrite_tag
pentru a înregistra o etichetă personalizată ca cea implicită % Postname%
și %an%
Această funcție acceptă trei argumente:
%data evenimentului%
([0-9] 4 - [0-9] 2 - [0-9] 2)
'EVENTDATE =
“. Dacă este furnizat, trebuie să se termine cu un '='.funcția wptuts_register_rewrite_tag () add_rewrite_tag ('% eventdate%', '([0-9] 4 - [0-9] 2 - [0-9] 2)'); add_action ('init', 'wptuts_register_rewrite_tag');
Nu numai că va get_query_var ( 'EVENTDATE')
returnați valoarea datei în URL, dar puteți utiliza eticheta %data evenimentului%
în Setări -> Permalink (împreună cu setările implicite %an%
, % Postname%
etc) și WordPress va interpreta corect. din pacate atunci când generează un post permanent, WordPress nu știe cum să înlocuiască %data evenimentului%
cu valoarea corespunzătoare: așa că postul nostru permanent se termină ca:
www.example.com/the-olympics-begin/%eventdate%
Trebuie să înlocuim %data evenimentului%
cu o valoare corespunzătoare, și putem face acest lucru folosind POST_LINK
filtru. (În acest exemplu, presupun că valoarea este stocată într-un câmp particularizat "data evenimentului
„).
funcția wp_tuts_filter_post_link ($ permalink, $ post) // Verificați dacă eticheta% eventdate% este prezentă în url: if (false === strpos ($ permalink, '% eventdate%')) $ return; // Descărcați data evenimentului stocată în post meta $ event_date = get_post_meta ($ post-> ID, 'eventdate', true); // Din păcate, dacă nu se găsește nicio dată, trebuie să furnizăm o "valoare implicită". $ event_date = (! gol ($ event_date)? $ event_date: '2012-01-01'); $ event_date = urlencode ($ event_date); // Înlocuiți '% eventdate%' $ permalink = str_replace ('% eventdate%', $ event_date, $ permalink); return $ permalink; add_filter ('post_link', 'wp_tuts_filter_post_link', 10, 2);
În partea a doua a acestei serii voi acoperi etichetele personalizate pentru tipurile personalizate de posturi.
Punctele finale sunt etichetele care sunt adăugate la adresa URL (/ Trackback / [valoare]
este cea mai comună). Are mai multe utilizări potențiale: afișarea diferitelor șabloane în funcție de valoarea setată, notificări personalizate și afișarea postărilor în diferite "formate" (printabile, XML, JSON etc.).
Puteți crea puncte finale cu add_rewrite_endpoint
. Această funcție acceptă două argumente:
JSON
","formă
", etc.Măștile implicite pentru parametrii finali sunt:
Punctele de sfârșit sunt extrem de flexibile, le puteți folosi cu operatori bituminoși, de exemplu, puteți adăuga un punct final pentru postarea și afișarea paginilor cu EP_PERMALINK | EP_PAGES
.
funcția wptuts_add_endpoints () add_rewrite_endpoint ('myendpoint', EP_PERMALINK); // adaugă punct final la permalinks add_rewrite_endpoint ('anotherendpoint', EP_AUTHORS | EP_SEARCH); // adaugă un punct final URL-urilor pentru autori sau rezultate de căutare add_action ('init', 'wptuts_add_endpoints');
Ca un scurt exemplu, obiectivele finale pot fi utile pentru depunerea formularelor. Să presupunem că avem o pagină de formular de contact cu nume Formular de contact
și cu permalink: www.example.com/contact
și doriți adresele URL:
www.example.com/contact/submission/success
- pentru a reflecta o prezentare de succes a formularuluiwww.example.com/contact/submission/error
- pentru a reflecta o depunere de formular nereușităAcest lucru se poate face cu obiective. Următoarele reprezintă un exemplu foarte simplu de utilizare a punctelor finale, astfel încât formularul este incredibil de simplu în verificările sale (și, de fapt, nu face nimic cu datele). În mod normal, o formă ca aceasta ar funcționa cel mai bine într-un plug-in, folosind coduri scurte - dar pentru scopurile acestui exemplu, creați o pagină cu următorul șablon și restul codului pe care îl puteți pune în functions.php
Formularul simplu de contact
Mesajul tau a fost trimis!Hopa! Se pare că a apărut o eroare ...
(În cazul în care vă întrebați, mierea se referă la această metodă de bază de capturare a spam-ului descrisă aici, cu siguranță nu este o dovadă de prostie, dar prelucrarea adecvată a formelor și protecția împotriva spamului este în afara subiectului). Acum, ne creez obiectivul final:
funcția wptuts_add_endpoint () add_rewrite_endpoint ('form', EP_PAGES); add_action ('init', 'wptuts_add_endpoint');
Apoi adăugăm "formă
"variabilă la matricea variabilelor recunoscute:
funcția wptuts_add_queryvars ($ query_vars) $ query_vars [] = 'formă'; returnați $ query_vars; add_filter ('query_vars', 'wptuts_add_queryvars');
În cele din urmă, oferim un handler de formular, care va procesa datele, va trimite formularul și apoi va redirecționa înapoi la pagina de contact cu valoarea finală relevantă adăugată.
funcția wptuts_form_handler () // Vrem să procesăm formularul dacă (! isset ($ _POST ['action']) || 'wptuts_send_message'! = $ _POST ['action']) return; // ID-ul paginii formularului de contact $ form_id = 2163; $ redirecționare = get_permalink ($ form_id); // Verificați nonces $ data = $ _POST ['wptuts_contact']; dacă isset ($ _ POST ['wptuts_contact_nonce']) ||! wp_verify_nonce ($ _ POST ['wptuts_contact_nonce'], 'wptuts_send_message')) // nu a verificat nerespectarea $ redirect. wp_redirect ($ redirect); Ieșire(); dacă ! empty ($ data ['confirmation'])) // Albine în miere ... $ redirect. = 'formă / eroare'; wp_redirect ($ redirect); Ieșire(); // Santize și validarea datelor etc. // Apoi, de fapt, faceți ceva cu datele dezinfectate // Succes! $ redirect = 'form / succes'; wp_redirect ($ redirect); Ieșire(); add_action ("init", "wptuts_form_handler");
Bineinteles, chiar si acest exemplu ar putea fi mult imbunatatit prin furnizarea de mesaje de eroare mai detaliate care sa transmita motivul pentru esec.
Cu destul permalinks activat WordPress produce automat URL-uri frumoase pentru feed-ul site-ului: www.example.com/feed/rss
. add_feed
vă permite să creați un feed personalizat, care, dacă destul de permalinks sunt activate, va avea, de asemenea, o adresă "drăguță". Această funcție acceptă două argumente:
furaje / [feed-name]
Următoarele sunt concepute ca un exemplu de add_feed
, și oferă un feed personalizat foarte simplu.
funcția wptuts_events_feed_callback () $ custom_feed = nouă WP_Query (array ('meta_key' => 'eventdate')); antet ('Content-Type:'. feed_content_type ('rss-http'). '; charset = ". get_option (" blog_charset "); echo "„; ?>Feedul meu personalizat have_posts ()):?> have_posts ()): $ custom_feed-> the_post (); ?> ]]> După ce ați spălat permalinks, feedul va fi disponibil la
www.example.com/feed/events
.
Verificarea regulilor de rescriere
Odată ce ați adăugat câteva dintre propriile reguli de rescriere (și le-ați spălat), probabil că veți dori să verificați dacă acestea funcționează corect și, dacă nu, aflați ce se întâmplă. Pentru aceasta, am recomandat insistent pluginul Monkeyman Rewrite Analyzer, un plug-in gratuit disponibil în depozitul WordPress. Odată activat, acest plug-in adaugă o pagină la secțiunea "Instrumente", care conține toate regulile de rescriere.
De asemenea, puteți testa regulile oferindu-i un exemplu de adresă URL, iar plug-in-ul va filtra regulile pentru a afișa numai modele potrivite și pentru a indica modul în care WordPress va interpreta adresa URL.
Distrează-te și ține-ți minte partea a 2-a, în curând!
Vă rugăm să rețineți: În prezent, există un bug în martorul nostru de sintaxă care afișează "
gol()
" la fel de "emptyempty ()
"Nu uitați să modificați codul în consecință.