Scrierea extensiilor extensibile cu acțiuni și filtre

Unul dintre numeroasele lucruri pe care le veți găsi atunci când investigați un cod sursă al dezvoltatorului de plugin-uri bune sunt cârligele personalizate și filtrele pe care dezvoltatorul le-a plasat în întregul plugin. Prezența acestor cârlige de acțiune și a filtrelor fac ca pluginul să fie "extensibil", ceea ce înseamnă că alte pluginuri și teme pot manipula sau adăuga comportamentul pluginului.

Scrierea pluginurilor extensibile este ceva ce aș dori să vă încurajez cu tărie să faceți. Există a mult din motive foarte grave pentru care ar trebui să o faceți, dar foarte puține (dacă există) motive pentru care ar trebui să evitați această practică.

Vom analiza mai multe elemente de extensii extensibile:

  • O explicație a pluginurilor extensibile
  • Motive pentru care ar trebui să scrieți extensii extensibile
  • Instrumentele de bază de care aveți nevoie
  • Cum trebuie să vă scrieți pluginurile pentru a le face extensibile
  • Exemple simple de cârlige și filtre pentru a ilustra modul în care le puteți folosi

O notă importantă: acest tutorial va folosi tehnici de programare bazate exclusiv pe procedură. Tot ceea ce vorbesc aici se aplică și în cazul programării orientate pe obiecte (OOP), dar este mai simplu să învățăm mai întâi aceste tehnici într-un cadru procedural.


Ce este un plugin extensibil?

Un plugin extensibil este unul care poate fi modificat și extins dincolo de scopul inițial de un alt plugin sau temă. Când un plugin este extensibil, alte pluginuri (sau teme) pot modifica comportamentul sau ieșirea pluginului. De exemplu, pluginurile de comerț electronic permit ca gateway-urile de plată suplimentare să permită procesarea unor achiziții prin intermediul unor sisteme suplimentare de plată. Aceste gateway-uri de plată sunt plugin-uri separate care se conectează la plugin-ul principal și-și extind funcționalitatea.

Orice și toate pluginurile pot fi extensibile, deși numai o mică minoritate de pluginuri publicate sunt. Pentru a fi extensibil sau modular (un alt termen pentru același lucru), dezvoltatorul unui plugin trebuie să ia o decizie conștientă de a face acest lucru prin implementarea elementelor necesare care fac posibil ca alte pluginuri și teme să se conecteze la plugin-ul principal comportament.


De ce scrieți pluginuri extensibile?

Există multe motive bune pentru a scrie pluginuri extensibile, dar unul dintre motivele principale este că pur și simplu nu există un motiv bun nu pentru a vă scrie pluginurile în acest fel, mai ales când pluginurile dvs. sunt lansate în comunitatea WordPress, fie ca plugin-uri gratuite sau plătite.

Când scrieți pluginuri extensibile, permiteți altor dezvoltatori să vă extindă plugin-ul și să îl îmbunătățească, fără a schimba niciodată codul sursă de bază. De asemenea, faceți mult mai ușor pentru dezvoltatori și utilizatori să adapteze plugin-ul pentru a se potrivi nevoilor lor mai bine. Permiteți-mi să vă dau un exemplu: în pluginul Easy Digital Downloads există un sistem de coduri de discount. Codurile de reducere sunt limitate la o singură utilizare per utilizator, astfel încât dacă un utilizator încearcă să aplice aceeași reducere pentru două achiziții diferite, va primi o eroare. Unul dintre utilizatorii mei din lumea reală a constatat că nu dorea să limiteze reducerile la o singură utilizare per utilizator, așa că i-am dat o funcție simplă pe care a abandonat-o într-un plugin personalizat și restricția a fost eliminată fără a atinge niciun cod de plugin.

Codul extensibil face, de asemenea, alți dezvoltatori extrem de fericiți atunci când o găsesc, deoarece munca lor de adaptare a codului a devenit mult mai ușoară.


Instrumentele / funcțiile de bază

Există mai multe instrumente cheie de care aveți nevoie pentru a scrie pluginuri extensibile. Dacă ați scris pluginuri sau teme înainte de a citi acest lucru, probabil că sunteți puțin cam familiarizat cu aceste funcții, chiar dacă este doar pentru că le-ați văzut folosite.

Înainte de a vă arăta funcțiile pe care le veți folosi, să vorbim mai întâi despre două concepte principale: cârlige și filtre.

Un cârlig de acțiune este un loc în pluginul dvs. care poate fi "cuplat" de funcții (atât în ​​plugin-ul dvs., cât și în alte pluginuri), pentru ca codul să fie executat în acel moment. Atunci când un cârlig de acțiune rulează, toate funcțiile care sunt conectate sau "cuplate", vor funcționa la fel.

Un cârlig de filtrare este, de asemenea, un loc în plugin-ul dvs. pentru alte funcții care se leagă, dar ele funcționează puțin diferit decât acțiunile. Filtrele permit ca datele să fie manipulate sau modificate înainte de a fi utilizate.

Diferența cheie între acțiuni și filtre este că acțiunile sunt de obicei utilizate pentru executarea funcțiilor, iar filtrele sunt de obicei folosite pentru manipularea datelor.

Dacă nu sunteți deja foarte familiarizat cu acțiunile și filtrele, aș recomanda cu tărie să citiți intrarea Codex pe ele.

Pentru acțiuni există patru funcții principale:

  • do_action () - aceasta definește o locație atrăgătoare pentru acțiuni
  • ADD_ACTION () - aceasta atribuie o funcție unui cârlig creat cu do_action ()
  • has_action () - aceasta verifică dacă o acțiune a fost înregistrată do_action ()
  • remove_action () - aceasta elimină o acțiune care a fost setată cu ADD_ACTION ()

Dintre cele patru, veți folosi do_action () și ADD_ACTION () cel mai.

Pentru filtre există și patru funcții principale:

  • apply_filters () - aceasta creează o locație atrăgătoare pentru filtrarea particularizată a filtrelor personalizate
  • add_filter () - acest lucru atașează un filtru personalizat unui cârlig creat cu apply_filters ()
  • has_filter () - aceasta verifică dacă un filtru a fost înregistrat apply_filters ()
  • remove_filter () - acest lucru elimină un filtru conectat anterior apply_filters ()

Ca și în cazul acțiunilor, apply_filters () și add_filter () sunt cele două pe care le veți folosi cel mai mult.

Dacă sunteți confuz în acest moment, nu vă faceți griji, vom examina cum să le folosim de fapt în secțiunea următoare.


Implementarea în propriile dvs. pluginuri

Pentru a vă face pluginul cu adevărat extensibil, trebuie să utilizați funcțiile cheie menționate mai sus pe tot pluginul. La început, poate fi dificil, greoi, enervant sau multe alte adjective aplicabile, pentru a plasa în mod constant aceste funcții suplimentare în întregul cod, mai ales când nu vedeți un beneficiu imediat sau o utilizare imediată.

Ceea ce veți găsi, totuși, este că, odată ce ați obișnuit să vă scrieți pluginurile cu toate aceste funcții în minte, va deveni a doua natură de a le include.

Există câteva scenarii principale în care veți folosi filtre în pluginurile dvs.:

  • Când sunt configurate matricele. Filtrele vor fi adăugate aici, astfel încât alte pluginuri să poată modifica datele înainte de a fi utilizate.
  • Când sunt configurate obiecte de date. La fel ca și cu matrice, veți folosi un filtru pe obiecte astfel încât alți dezvoltatori să poată schimba obiectul înainte de a fi folosit.
  • Când sunt configurate șiruri de date. Cu un filtru disponibil pe un șir, alți dezvoltatori pot schimba întreaga șir, modifica părți din ea sau pot adăuga pe ea.

Din scenariile de mai sus, este mai frecvent să folosiți filtre atunci când datele sunt returnate sau chiar înainte de a fi utilizate. De exemplu, dacă aveți un plugin care efectuează o interogare a postărilor, este mai bine să transmiteți o serie de argumente de interogare printr-un filtru înainte de a fi transmise get_posts () sau WP_Query astfel încât alții să poată manipula interogarea înainte de a fi făcută.

Când vine vorba de acțiuni, există și câteva situații principale în care le veți plasa:

  • Înainte de executarea unei sarcini.
  • După ce se execută o sarcină.
  • În marcajul dvs. pentru a permite introducerea unui marcaj suplimentar.

Să luăm în considerare câteva exemple acum.

1. Afișarea codului HTML cu un cod scurt

Codurile scurte care generează cod HTML sunt extrem de frecvente (de fapt, acestea sunt probabil cele mai frecvente dintre toate codurile scurte) și una dintre modalitățile prin care putem face codurile scurte ale plugin-ului nostru mai prietenoase cu alți dezvoltatori este furnizarea unei modalități pentru modificarea conținutului shortcode, dar fără a solicita retragerea acestuia din nou și înregistrarea.

Toate codurile scurte se întorc mai degrabă decât să le ecou conținutul, ceea ce înseamnă că datele afișate pe ecran vor fi sub formă de șir înainte de a fi returnate. Deoarece întregul ieșire HTML este sub forma unui șir, puteți trece șirul printr-un filtru înainte de ao returna. Acest lucru va face posibil ca alți dezvoltatori să modifice codul HTML al codului dvs. scurt.

Un dezvoltator ar putea dori să adauge un marcaj suplimentar înainte și după standardul HTML: cu filtrul în loc, pot face acest lucru.

Codul dvs. scurt poate să arate astfel:

 funcția wptp_sample_shortcode (atts, $ content = null) $ html = '
„; $ html. = '

Conținutul codului scurt al eșantionului

„; $ html. = '
„; returnați $ html;

Putem îmbunătăți acest lucru prin adăugarea unui filtru la returnare, după cum urmează:

 funcția wptp_sample_shortcode (atts, $ content = null) $ html = '
„; $ html. = '

Conținutul codului scurt al eșantionului

„; $ html. = '
„; returnează apply_filters ('wptp_shortcode_html', $ html);

Codul HTML din codul nostru scurt poate fi modificat în felul următor:

 funcția wptp_modify_html ($ html) return '
". $ html. '
„; add_filter ('wptp_shortcode_html', 'wptp_modify_html');

Acest lucru va duce la faptul că codul original creat în codul scurt este înfășurat cu altul div etichetă.

2. Interogarea posturilor

Efectuarea de interogări personalizate în plugin-uri este o practică obișnuită. Să presupunem pentru un moment că ați scris un plugin care înregistrează un tip de post particularizat numit "cărți", iar în plugin-ul dvs. este o funcție de a arăta cărțile create. Funcția dvs. de a interoga cărțile ar putea arăta astfel:

 funcția wptp_show_books () $ query_args = array ('post_type' => 'cărți', 'posts_per_page' => 5); $ books = noua valoare WP_Query ($ query_args); dacă ($ books-> have_posts ()): în timp ce ($ books-> have_posts ()): $ books-> the_post () // afișează informații despre fiecare carte în cele din urmă; endif; wp_reset_postdata (); 

Dar dacă un utilizator dorea să modifice tipurile de cărți returnate, probabil selectând doar cărți dintr-o anumită categorie? Puteți face acest lucru mult mai ușor pentru ei, făcând acest lucru:

 funcția wptp_show_books () $ query_args = array ('post_type' => 'cărți', 'posts_per_page' => 5, 'author' => 3); $ books = noua valoare WP_Query (apply_filters ('wptp_books_query', $ query_args)); dacă ($ books-> have_posts ()): în timp ce ($ books-> have_posts ()): $ books-> the_post () // afișează informații despre fiecare carte în cele din urmă; endif; wp_reset_postdata (); 

Singura schimbare pe care am făcut-o era să adaug un filtru în jurul valorii de $ query_args, ceea ce înseamnă că alți dezvoltatori (sau utilizatori) pot modifica argumentele interogării înainte ca acestea să fie trecute WP_Query. De exemplu, am putea seta interogarea să afișeze numai cărți de la autor 3 cum ar fi:

 funcția wptp_alter_books_query ($ args) $ args ['author'] = 3; întoarcere $ args;  add_filter ('wptp_books_query', 'wptp_alter_books_query');

3. Extindeți marcajul

Să ne extindem acum pe exemplul nr. 2 și să îl facem chiar mai bine. Am adăugat deja un filtru care permite utilizatorilor să modifice interogarea, acum să adăugăm câteva cârlige pentru a ne permite să modificăm codul HTML creat.

Mai intai vom modifica putin HTML-ul original:

 funcția wptp_show_books () $ query_args = array ('post_type' => 'cărți', 'posts_per_page' => 5, 'author' => 3); $ books = noul WP_Query (apply_filters ('wptp_books_query', $ query_args); dacă ($ books-> have_posts ()): echo '
„; în timp ce ($ books-> have_posts ()): $ books-> the_post () echo '
„; echo "

". get_the_title (). '

„; echo "
„; endwhile; echo "
„; endif; wp_reset_postdata ();

Acum vrem să oferim dezvoltatorilor posibilitatea de a adăuga un marcaj suplimentar în diferite puncte, cum ar fi:

  • Înainte de afișarea oricărui cod HTML
  • După terminarea codului HTML
  • Înainte de titlul fiecărei cărți
  • După titlul fiecărei cărți

Vă puteți imagina un scenariu în care un utilizator ar dori să adauge o miniatură înainte sau după titlul cărții. Pentru a face acest lucru posibil, vom folosi do_action () pentru a crea locații atrăgătoare, cum ar fi:

 funcția wptp_show_books () $ query_args = array ('post_type' => 'cărți', 'posts_per_page' => 5, 'author' => 3); $ books = noua valoare WP_Query (apply_filters ('wptp_books_query', $ query_args)); dacă ($ books-> have_posts ()): do_action ('wptp_books_before'); echo "
„; în timp ce ($ books-> have_posts ()): $ books-> the_post () echo '
„; do_action ('wptp_before_book_title', get_the_ID ()); echo "

". get_the_title (). '

„; do_action ('wptp_after_book_title', get_the_ID ()); echo "
„; endwhile; echo "
„; do_action ('wptp_books_after'); endif; wp_reset_postdata ();

Rețineți că cele două cârlige interioare (care înconjoară titlul) au un al doilea parametru get_the_ID (). Această variabilă, care va fi cartea de identitate a cărții, va fi disponibilă ca parametru pentru orice funcție atinsă. Pentru a adăuga o miniatură a cărții, de exemplu, putem face acest lucru:

 funcția wptp_show_book_image ($ book_id) echo get_the_post_thumbnail ($ book_id, 'thumbnail');  add_action ('wptp_before_book_title', 'wptp_show_book_image');

Real World Examples

Aș dori acum să vă arăt câteva exemple din lumea reală de pluginuri extensibile, inclusiv exemple ale unor funcții extensibile.

1. Soliloquy

Soliloquy este un plug-in slider puternic pentru WordPress care răspunde la crearea și menținerea unor glisoare de imagine receptive, eficiente, sigure și prietenoase cu SEO..

Aproape totul în acest plugin este extensibil. Iată doar un exemplu:

 $ etichete = apply_filters ('tgmsp_post_type_labels', array ('name' => __ ('Soliloquy', 'soliloquy'), singular_name '=> 'Add_new_item' => __ ('Adăugați un nou Soliloquy Slider', 'soliloquy'), 'edit_item' => => __ ('Soliloquy Slider', 'soliloquy'), 'view_item' => __ ('Soliloquy Slider', 'soliloquy') , "not_found" => __ ("Nu s-au găsit soliloquii", "soliloquy"), "not_found_in_trash" '=> __ (' Soliloquy ',' soliloquy '))); $ args = apply_filters (' tgmsp_post_type_args ', array show_ui '=> true,' show_in_admin_bar '=> false,' rewrite '=> false,' query_var '=> false,' menu_position '=> 100,' menu_icon '=> plugins_url (' menu-icon.png ', nume dir (__FILE__)),' suport '=> array (' title ')));

Acesta este modul în care Thomas Griffin (dezvoltatorul pluginului) stabilește argumentele atât pentru etichetele și atributele tip personalizate post. Prezența celor două filtre ale sale, tgmsp_post_type_labels și tgmsp_post_type_args, face foarte simplu pentru alți dezvoltatori să redenumească tipul postului de cursor sau să schimbe tipul de suport al postului.

2. bbPress

De departe unul dintre pluginurile personale favorite ale tuturor timpurilor, bbPress este un plug-in pe forum pentru WordPress. Întreg plugin-ul este un exemplu perfect de a vă face extensiile extensibile, deoarece are literalmente acțiuni și filtre peste tot. Are un filtru special care se aplică la extragerea conținutului unui forum:

 funcția bbp_get_forum_content ($ forum_id = 0) $ forum_id = bbp_get_forum_id ($ forum_id); // Verificați dacă este necesară parola în cazul în care (post_password_required ($ forum_id)) se întoarce get_the_password_form (); $ content = get_post_field ('post_content', $ forum_id); returnează apply_filters ('bbp_get_forum_content', $ content, $ forum_id); 

Înainte ca conținutul forumului să fie returnat, acesta este trecut printr-un filtru numit bbp_get_forum_content care permite dezvoltatorului să modifice conținutul înainte de a fi afișat vreodată.

3. Descărcări Easy Digital

Descărcări Easy Digital, sau EDD, este unul dintre pluginurile mele care a fost construit pentru a face extrem de ușor să vândă produse digitale prin WordPress. Ca și în cazul celor mai multe pluginuri de comerț electronic, EDD are un proces de plată la care cumpărătorul trece, astfel încât să poată introduce detaliile personale și de plată. După ce toate aceste informații sunt colectate, totul merge la un gateway de plată (un sistem de procesare a plății), dar înainte de a merge la poartă, se aplică un filtru care permite manipularea datelor înainte de a fi utilizat de către plăți sistem:

 $ buy_data = apply_filters ('edd_purchase_data_before_gateway', $ buy_data, $ valid_data);

Prezența acestui filtru face posibilă ajustarea sumelor de cumpărare (poate pentru reduceri speciale), adăugarea de impozite, adăugarea sau eliminarea produselor din achiziție și mult mai multe.


Concluzie

Pluginurile extensibile beneficiază pe toată lumea: dezvoltatorul original, alți dezvoltatori și utilizatorii înșiși.

Există atât de multe motive pentru care ar trebui să vă scrieți pluginurile cu cod extensibil în minte, deci de ce nu faceți asta?

Instrumentele prezentate aici sunt tot ceea ce aveți nevoie pentru a începe. Aveți întrebări? Întreabă-te!

Cod