În acest tutorial voi explica o tehnică care vă permite să utilizați un fișier șablon pentru toate nevoile dvs. HTML! Nu veți mai trebui să 'echo' șiruri de caractere din interiorul funcțiilor dvs., sau vă faceți griji despre abandonarea și iesirea din PHP doar pentru a scoate un anumit marcaj.
Am petrecut mulți ani folosind cadre MVC (cum ar fi Zend și Laravel în zilele noastre) unde este o practică optimă de a separa "logica de programare" (funcții sau metode) de "vizualizarea" ta (marcajul HTML rezultat). Acest mereu duce la o bază de cod mai sustenabilă și este de fapt mult mai ușor de scris. Având acest fundal, m-au determinat să vină cu o soluție similară la dezvoltarea pluginurilor pentru WordPress! Nu este nimic fantezist - este doar un "ajutor" care vă va permite să eliminați toate fragmentele HTML și să scăpați de funcțiile dvs. și să le aruncați în siguranță în propriul fișier "șablon".
Asadar, sper ca acest tutorial suna interesant pentru tine si fara sa mai vorbim, sa incepem!
Să lăsăm acest tutorial oprit, analizând exact ceea ce vom îmbunătăți.
Este foarte comun să vezi ceva de genul acesta într-un plugin: (acest fragment apare de fapt dintr-unul din propriile tutoriale pe acest site: p)
add_shortcode ('faq', function () $ posturi = get_posts (array (// Obțineți tipul de postare personalizată FAQ 'numberposts' => 10, 'orderby' => 'menu_order', 'order' => 'post_type' => 'faq',)); $ faq = '„; // Deschiderea foreach-ului containerului ($ posturi ca $ post) // Generarea marcajului pentru fiecare intrebare $ faq. = Sprintf (('„; // Închideți returul recipientului $ faq; // Returnați codul HTML. );% 1 $ s
% 2 $ s'), $ post-> post_title, wpautop ($ post-> post_content)); $ faq. = '
Ei bine, nimic, într-adevăr. Dar ar putea fi mai curat, mai ușor la scară și mai ușor de întreținut!
Rularea de sus în jos, putem vedea că toate într-o singură funcție suntem:
Acum ar fi foarte bine sa te uiti la asta si sa te gandesti "Big deal! Sunt doar cateva linii de HTML, care e problema?" În anumite privințe, vă aflați foarte bine în dreptul dvs. de a gândi așa. Dar rețineți, sunt doar 17 linii de cod în acest moment - ce se întâmplă când extindeți / îmbunătățiți pluginul? Ce se întâmplă atunci când plugin-ul dvs. crește la 50/100/1000 linii de cod (sau mai mult!). Veți fi totuși fericit având șiruri de caractere HTML dotate în jurul funcției dvs. în diverse locuri? Ce se întâmplă atunci când doriți să transmiteți câteva coduri HTML care necesită o "evadare" ciudată pentru a funcționa corect în cadrul codului dvs. PHP?
Sperăm că puteți vedea că această abordare a creării și transmiterii HTML Markup poate deveni foarte problematică! Să nu mai vorbim că devine foarte greu să menținem și să îmbunătățim HTML atunci când este doar împrăștiată.
Deci, cu toate acestea în minte, am luat-o pe mine pentru a schimba modul în care vă gândiți la ieșirea HTML în WordPress. Pentru totdeauna.
Ok, hai să facem asta.
Pluginul nostru este simplu, include doar Vedere
astfel încât să putem folosi în oricare dintre celelalte plugin-uri ale noastre.
/ * vizualizare_renderer.php * / include ('View.php');
Bine, acum că am inclus Vedere
clasa, este timpul să-l construim.
Aici avem o clasă chemată Vedere
cu o singură funcție statică numită face
(aceasta ne va permite să folosim sintaxa Vizualizare :: render (șablon $)
de oriunde în cadrul pluginurilor noastre) și necesită doi parametri:
$ fILEPATH
- Calea spre fișierul șablon. Nu uitați că ne vom păstra șabloanele în cadrul Vedere dosarul pe care l-am creat mai devreme$ videotex
- Orice variabile pe care am dori să le accesăm în cadrul șablonului (mai multe despre acest lucru mai târziu)Copiați codul de mai jos în View.php:
În primul rând, verificăm dacă $ videotex
varible are o valoare (adică am trimis ceva pentru a fi utilizat în șablon?). În caz contrar, vom extrage conținutul (mai multe despre aceasta mai târziu)
Apoi folosim tamponul de ieșire al PHP. Aceasta ne permite să analizăm un fișier PHP și să salvăm conținutul într-o variabilă
În cele din urmă vom returna șirul
Notă: Nu uitați să activați plugin-ul acum din panoul Admin
Pare destul de simplu, nu? Exact! Dar, deși pare să fie doar o funcție foarte simplă, ne dă luxul de a fi capabili să scriem pluginurile într-un mod superorganizat, scalabil și menținut. Vă rog, permiteți-mi să demonstrez ...
Să creăm un simplu plugin numit cursor
** Notă: Aceasta este doar pentru scopuri demonstrative. Simțiți-vă liber să utilizați propriul plugin aici.
OK, acum vom adăuga un scurtcod care va prelua ultimele 5 postări și le va afișa într-o listă cu titlul și conținutul. (Din motive de coerență, vom adăuga clasa plugin-ului nostru și acțiunile noastre cârlige în același fișier plugin, dar vă rugăm să nu faceți acest lucru în "real-life": p)
/ ** * Adăugați codul scurt (PHP 5.3 și versiunea ulterioară) * / add_shortcode ('slider', function () return Slider :: display (););
Asta ne va permite să folosim pur și simplu [Cursor]
în orice post / pagină și va afișa rezultatul Slider :: display ()
afişa()
Metodăclasa Slider public public display function () // Return HTML AICI.
/ * * Obțineți cele mai recente 5 postări * / public static display () $ posts = get_posts (array ('numberposts' => 5));
Acum avem o mulțime de post
obiecte și suntem pregătiți să construim HTML-ul nostru prin looping prin ele. Dar nu vom începe pur și simplu să inserăm șiruri HTML în funcția noastră aici! În schimb, vom trece gama de obiecte într-un fișier de șabloane și vom avea toate HTML-urile generate de rău.
Acest șablon va conține toate marcările noastre și ne va permite să accesăm datele pe care le avem trimite mai târziu.
De fiecare dată când vrem să folosim orice variabilă în șabloanele noastre, putem pur și simplu trimite ele prin stabilirea unei valori în $ videotex
matrice. Oricine este familiarizat cu utilizarea cadrelor MVC se va simți foarte acasă cu această abordare.
$ viewData = array ('posts' => $ posts);
Matricea cheie aici ('posturi
') este importantă, pentru că așa vom face referire la datele din cadrul șablonului. (Puteți numi asta oricare doriți, dar rămâneți la ceva care are sens.)
Ok, deci ne-am uitat la modul de a recupera cele mai recente 5 posturi și cum să trimiteți acea matrice de obiecte în șablon, acum este momentul pentru a elabora fișierul șablon.
= $post->post_title?>
= $post->post_content?>
Ah! Cât de drăguț pare să aibă toate aceste marcări în propriul dosar separat, departe de recuperarea datelor noastre și de logica programării? Mare, știu! Cea mai importantă parte a acestei abordări este că accesăm numai date din variabilele din cadrul șablonului. Toată "logica" ar trebui făcută în cadrul metodei care apelează șablonul. Acest lucru duce la un flux de lucru foarte frumos, deoarece aveți o separare completă a preocupărilor.
Imaginați-vă cât de ușor va fi acum când sunteți pregătit să construiți acest plugin. Nu mai sunt șiruri de caractere concatenante și caractere care scapă în cadrul funcțiilor.
Ok, am văzut toate părțile componente, să vedem cum se potrivesc împreună pentru a ne permite să facem un șablon și să obținem un șir înapoi (pe care apoi ne putem întoarce la codul nostru scurt):
Vedere
clasa existășablon $
Vezi :: render ()
metodă și să-i transmită cei doi parametri necesariÎn acest caz, noi întoarcere rezultatul șablonului redactat pentru că așa este numerele scurte muncă. Dar dacă aveați nevoie ecou în schimb, rezultatele (de exemplu, când creați o pagină de administrator, apelul așteaptă ca imprimarea să fie imprimată direct), apoi pur și simplu înlocuiți întoarcere cu ecou.
afişa()
Metoda în întregimecursorul clasei static $ template = '/templates/01.template.php'; public display static function () if (class_exists ('View')) // Obțineți ultimele 5 posturi $ posts = get_posts (array ('numberposts' => 5)); // Setați vizualizarea datelor $ viewData = array ('posts' => $ posts); // Descărcați calea completă la fișierul șablon. $ templatePath = dirname (__FILE__). șablon static :: $; // Returnează returul rendered HTML View :: render ($ templatePath, $ viewData); else return "Încercați să redați un șablon, dar nu găsim clasa View";
Sper că puteți aprecia nivelul de organizare al acestei abordări vă va permite! Acum tu afişa funcția este responsabilă doar de colectarea datelor de care are nevoie și de returnarea rezultatelor șablonului redat.
Exemplul nostru de mai sus este cam la fel de fundamental pe cât se întâmplă. Chiar și așa, este încă un flux de lucru mult îmbunătățit. Acum, să aruncăm o privire la un alt exemplu care arată cât de utilă poate fi cu adevărat.
Spune, de exemplu, plugin-ul dvs. utilizează o casetă meta custom. Pentru a face acest lucru, trebuie să:
cursor
clasăclasa Slider static $ metaBox = '/templates/metabox.template.php'; funcția publică __construct () add_action ('add_meta_boxes', array ($ this, 'add_some_meta_box')); / ** * adaugă containerul meta box * / funcția publică add_some_meta_box () add_meta_box ('some_meta_box_name', 'Some Meta Box Headline', array ($ this, 'render_meta_box_content' înalt', ); / ** * Render Meta Box conținut * / funcția publică render_meta_box_content () / ** Din Codex ** / echo 'TEST OUTPUT - acest lucru devine redat în interiorul casetei meta.
„; // clasa // adăugați funcția de cârlig de acțiune call_Slider () returnează cursorul nou (); dacă (is_admin ()) add_action ('load-post.php', 'call_Slider');
Uitați-vă la render_meta_box_content
acolo. Este o ocazie perfectă de a utiliza View Renderer! Imaginați-vă un exemplu mai realist ca acesta:
/ ** * Render Content Meta Box * / funcția publică render_meta_box_content ($ post) $ name = get_post_meta ($ post-> ID, "nume"); $ fieldName = static :: $ fieldName; echo "Numele dumneavoastră:
„; echo "„; echo "„; echo "„;
Urg! Sigur, se face treaba, dar este atât de dificil să o faci așa! Ce zici de folosirea în schimb a View Renderer.
/ ** * Render Content Meta Box * / funcția publică render_meta_box_content ($ post) $ viewData = array ('name' => get_post_meta ($ post-> ID, 'name'), 'field' => static :: $ numele domeniului ); $ templatePath = dirname (__FILE__). static :: $ METABOX; echo Vizualizare :: render ($ templatePath, $ viewData);
Și în fișierul șablon:
Numele dumneavoastră:
Ar putea părea doar ca un beneficiu foarte mic în acest exemplu. Dar crede-mă, dacă îți păstrezi grijile separate, vei deveni mult mai bine dezvoltator WordPress destul de repede.
Cred că până acum probabil că aveți o bună înțelegere a ceea ce încercăm să realizăm aici și vă sfătuiesc să încercați să utilizați această tehnică atunci când construiți pluginuri în viitor. Sperăm că veți găsi "separarea preocupărilor" pentru a vă aduce beneficii.
Tutorial Note:
Aș fi interesat să știu ce utilizări ați găsit pentru această tehnică, așa că vă rugăm să partajați în comentariile :)