Cum să faci extensibil un plugin WordPress
Publicat: 2022-03-10Ați folosit vreodată un plugin și ați dorit să facă ceva puțin diferit? Poate că aveai nevoie de ceva unic care să depășească domeniul de aplicare al paginii de setări a pluginului.
Eu personal m-am confruntat cu asta și pun pariu că și tu. Dacă sunteți un dezvoltator de pluginuri WordPress, cel mai probabil unii dintre utilizatorii dvs. au întâlnit acest lucru în timp ce utilizau pluginul dvs.
Iată un scenariu tipic: ați găsit în sfârșit acel plugin care face tot ce aveți nevoie - cu excepția unui lucru mic important. Nu există nicio setare sau opțiune pentru a activa acel lucru minuscul, așa că răsfoiți documentația și descoperiți că nu puteți face nimic în acest sens. Solicitați funcția în forumul de asistență al pluginului WordPress - dar fără zaruri. În cele din urmă, îl dezinstalați și continuați căutarea.
Imaginați-vă dacă ați fi dezvoltatorul acestui plugin. Ce ați face dacă un utilizator ar solicita o anumită funcționalitate?
Ideal ar fi să o implementezi. Dar dacă caracteristica a fost pentru un caz de utilizare foarte special, atunci adăugarea acesteia ar fi nepractică. Nu ar fi bine să aveți o setare de plugin pe care doar 0,1% dintre utilizatorii dvs. ar avea o utilizare.
Ați dori doar să implementați funcții care afectează majoritatea utilizatorilor dvs. În realitate, 80% dintre utilizatori folosesc 20% dintre funcții (regula 80/20). Așadar, asigurați-vă că orice funcție nouă este foarte solicitată și că 80% dintre utilizatorii dvs. ar beneficia de ea, înainte de a o implementa. Dacă ați creat o setare pentru fiecare caracteristică solicitată, atunci pluginul dvs. ar deveni complicat și umflat - și nimeni nu vrea asta.
Cel mai bun pariu este să faci pluginul extensibil, din punct de vedere al codului, astfel încât alte persoane să-l poată îmbunătăți sau modifica pentru propriile nevoi.
În acest articol, veți afla de ce este o idee bună să vă faceți extensibil pluginul. De asemenea, voi împărtăși câteva sfaturi despre cum am învățat să fac asta.
Ce face un plugin extensibil?
Pe scurt, un plugin extensibil înseamnă că aderă la partea „O” a principiilor SOLID ale programării orientate pe obiecte - și anume, principiul deschis/închis.
Dacă nu sunteți familiarizat cu principiul deschis/închis, înseamnă practic că alte persoane nu ar trebui să fie nevoite să vă editeze codul pentru a modifica ceva .
Aplicând acest principiu unui plugin WordPress, ar însemna că un plugin este extensibil dacă are prevederi în el care permit altor persoane să-și modifice comportamentul. Este la fel cum WordPress permite oamenilor să se „prindă” în diferite zone ale WordPress, dar la nivelul pluginului.
Un exemplu tipic de plugin
Să vedem cum putem crea un plugin extensibil, începând cu un exemplu de plugin care nu este.
Să presupunem că avem un plugin care generează un widget din bara laterală care afișează titlurile celor mai recente trei postări. În centrul pluginului se află o funcție care pur și simplu include titlurile acelor trei postări în etichete de listă:
function get_some_post_titles() { $args = array( 'posts_per_page' => 3, ); $posts = get_posts( $args ); $output = '
- ';
foreach ( $postări ca $post ) {
$ieșire .= '
- ' . $post->post_title . ' '; } $ieșire .= '
Deși acest cod funcționează și își face treaba, nu este destul de extensibil.
De ce? Deoarece funcția este setată în moduri proprii, nu există nicio modalitate de a-și schimba comportamentul fără a modifica direct codul.
Ce se întâmplă dacă un utilizator ar dori să afișeze mai mult de trei postări sau poate să includă linkuri cu titlurile postărilor? Nu există nicio modalitate de a face asta cu codul de mai sus. Utilizatorul este blocat cu modul în care funcționează pluginul și nu poate să-l schimbe.
Includerea a o sută de setări nu este răspunsul
Există mai multe moduri de a îmbunătăți pluginul de mai sus pentru a permite utilizatorilor să-l personalizeze.
Un astfel de mod ar fi să adăugați o mulțime de opțiuni în setări, dar chiar și asta ar putea să nu satisfacă toate posibilitățile pe care utilizatorii le-ar dori de la plugin.
Ce se întâmplă dacă utilizatorul ar dori să facă oricare dintre următoarele (scenarii pe care le vom revizui mai târziu):
- afișați produse WooCommerce sau postări dintr-o anumită categorie;
- afișa articolele într-un carusel furnizat de un alt plugin, în loc să fie o simplă listă;
- efectuați o interogare personalizată a bazei de date și apoi utilizați postările respectivei interogări din listă.
Dacă am adăuga o sută de setări widget-ului nostru, atunci am putea acoperi cazurile de utilizare de mai sus. Dar dacă unul dintre aceste scenarii se schimbă, iar acum utilizatorul dorește să afișeze numai produsele WooCommerce care sunt în stoc în prezent? Widgetul ar avea nevoie de și mai multe setări pentru a găzdui acest lucru. Destul de curând, vom avea o mulțime de setări.
De asemenea, un plugin cu o listă uriașă de setări nu este tocmai ușor de utilizat. Îndepărtați-vă de această rută dacă este posibil.
Deci, cum am proceda pentru a rezolva această problemă? Am face pluginul extensibil.
Adăugând propriile noastre cârlige pentru a-l face extensibil
Studiind codul pluginului de mai sus, vedem câteva operațiuni pe care funcția principală le efectuează:
- Primește postări folosind
get_posts
. - Acesta generează o listă de titluri de postări.
- Acesta returnează lista generată.
Dacă alți oameni ar modifica comportamentul acestui plugin, munca lor ar implica cel mai probabil aceste trei operațiuni. Pentru a face pluginul nostru extensibil, ar trebui să adăugăm cârlige în jurul acestora pentru a le deschide pentru alți dezvoltatori.
În general, acestea sunt zone bune pentru a adăuga cârlige la un plugin:
- în jurul și în cadrul proceselor majore,
- când construiți HTML de ieșire,
- pentru modificarea interogărilor posturilor sau bazei de date,
- înainte de a returna valori dintr-o funcție.
Un exemplu tipic de plugin extensibil
Luând aceste reguli generale, putem adăuga următoarele filtre pentru a face pluginul nostru extensibil:
- adăugați
myplugin_get_posts_args
pentru modificarea argumentelorget_posts
, - adăugați
myplugin_get_posts
pentru a înlocui rezultateleget_posts
, - adăugați
myplugin_list_item
pentru a personaliza generarea unei intrări în listă, - adăugați
myplugin_get_some_post_titles
pentru a înlocui lista generată returnată.
Iată din nou codul cu toate cârligele adăugate:
function get_some_post_titles() { $args = array( 'posts_per_page' => 3, ); // Let other people modify the arguments. $posts = get_posts( apply_filters( 'myplugin_get_posts_args', $args ) ); // Let other people modify the post array, which will be used for display. $posts = apply_filters( 'myplugin_get_posts', $posts, $args ); $output = '
- ';
foreach ( $postări ca $post ) {
// Permite altor persoane să modifice intrarea în listă.
$ieșire .= '
- ' . apply_filters('myplugin_list_item', $post->post_title, $post ) . ' '; } $ieșire .= '
De asemenea, puteți obține codul de mai sus în arhiva GitHub.
Adaug aici o mulțime de cârlige, ceea ce ar putea părea nepractic, deoarece codul eșantion este destul de simplu și mic, dar ilustrează punctul meu de vedere: adăugând doar patru cârlige, alți dezvoltatori pot personaliza acum comportamentul pluginului în tot felul de moduri.
Spațierea numelor și contextul pentru cârlige
Înainte de a continua, rețineți două lucruri importante despre cârligele pe care le-am implementat:
- Spațiem numerele cu
myplugin_
.
Acest lucru asigură că numele cârligului nu intră în conflict cu cârligul altui plugin. Aceasta este doar o bună practică, deoarece dacă se numește un alt cârlig cu același nume, ar putea duce la efecte nedorite. - De asemenea, transmitem o referință la
$args
în toate cârligele pentru context.
Fac acest lucru pentru ca, dacă alții folosesc acest filtru pentru a schimba ceva în fluxul codului, ei pot folosi acel parametru$args
ca referință pentru a-și face o idee despre motivul pentru care a fost numit hook, astfel încât să își poată efectua ajustările în consecință.
Efectele cârligelor noastre
Vă amintiți scenariile unice despre care am vorbit mai devreme? Să le revedem și să vedem cum le-au făcut posibile cârligele noastre:
- Dacă utilizatorul dorește să afișeze produse WooCommerce sau postări dintr-o anumită categorie , atunci fie poate folosi filtrul
myplugin_get_posts_args
pentru a adăuga propriile argumente pentru când pluginul interogează postări, fie poate folosimyplugin_get_posts
pentru a suprascrie complet postările cu propria listă. - Dacă utilizatorul dorește să afișeze articolele într-un carusel furnizat de un alt plugin , în loc să fie o listă simplă, atunci poate suprascrie întreaga ieșire a funcției cu
myplugin_get_some_post_titles
și, în schimb, poate scoate un carusel de acolo. - Dacă utilizatorul dorește să efectueze o interogare personalizată a bazei de date și apoi să folosească postările acelei interogări din listă, atunci, similar cu primul scenariu, poate folosi
myplugin_get_posts
pentru a-și folosi propria interogare în baza de date și pentru a schimba matricea de postări.
Mult mai bine!
Un exemplu rapid despre cum să folosiți filtrele noastre
Dezvoltatorii pot folosi add_filter
pentru a se conecta la filtrele noastre de mai sus (sau pot folosi add_action
pentru acțiuni).
Luând primul nostru scenariu de mai sus, un dezvoltator poate face următoarele pentru a afișa produsele WooCommerce folosind filtrul myplugin_get_posts_args
pe care l-am creat:
add_filter( 'myplugin_get_posts_args', 'show_only_woocommerce_products' ); function show_only_woocommerce_products( $args ) { $args['post_type'] = 'product'; return $args; }
Putem folosi și cârlige de acțiune
Pe lângă utilizarea apply_filters
, putem folosi și do_action
pentru a face codul nostru extensibil. Diferența dintre cele două este că prima le permite altora să schimbe o variabilă, în timp ce cea din urmă le permite altora să execute funcționalități suplimentare în diferite părți ale codului nostru.
Când folosim acțiuni, expunem, în esență, fluxul pluginului altor dezvoltatori și le lăsăm să efectueze alte lucruri în tandem.
S-ar putea să nu fie util în exemplul nostru (pentru că afișăm doar un cod scurt), dar ar fi util în altele. De exemplu, având în vedere un plugin de rezervă extensibil, am putea crea un plugin care să încarce și fișierul de rezervă într-un serviciu terță parte, cum ar fi Dropbox.
"Grozav! Dar de ce ar trebui să-mi pese să-mi fac pluginul extensibil?”
Ei bine, dacă încă nu sunteți vândut de idee, iată câteva gânduri despre de ce să permiteți altor persoane să modifice comportamentul pluginului dvs. este o idee bună.
Deschide pluginul pentru mai multe posibilități de personalizare
Fiecare are nevoi diferite. Și există șanse mari ca pluginul tău să nu le satisfacă pe toate și nici nu le poți anticipa. Deschiderea pluginului pentru a permite modificări în domenii cheie ale comportamentului pluginului poate face minuni.
Permite oamenilor să introducă modificări fără a atinge codul pluginului
Alți dezvoltatori nu vor fi forțați să schimbe direct fișierele pluginului dvs. Acesta este un beneficiu imens, deoarece modificarea directă a fișierului unui plugin este în general o practică proastă. Dacă pluginul este actualizat, atunci toate modificările dvs. vor fi șterse.
Dacă adăugăm propriile noastre cârlige pentru ca alte persoane să le folosească, atunci modificările pluginului pot fi puse într-o locație externă - de exemplu, într-un alt plugin. Făcut în acest fel, pluginul original nu va fi atins deloc și poate fi actualizat liber fără a întrerupe nimic, iar toate modificările din celălalt plugin vor rămâne intacte.
Concluzie
Pluginurile extensibile sunt cu adevărat minunate și ne oferă loc pentru o mulțime de posibilități de personalizare. Dacă vă faceți extensia pluginului, utilizatorii și alți dezvoltatori vă vor iubi pentru asta.
Aruncă o privire la pluginuri precum WooCommerce, Easy Digital Downloads și ACF. Aceste pluginuri sunt extensibile și vă puteți da seama cu ușurință, deoarece numeroase alte plugin-uri din directorul de pluginuri WordPress le adaugă funcționalitate. De asemenea, oferă o gamă largă de cârlige de acțiune și de filtrare care modifică diferite aspecte ale pluginurilor. Regulile de bază pe care le-am enumerat mai sus au apărut în studiul meu asupra lor.
Iată câteva concluzii pentru a vă face pluginul extensibil:
- Urmați principiul deschis/închis. Alți oameni nu ar trebui să fie nevoiți să vă editeze codul pentru a modifica ceva.
Pentru a face pluginul extensibil, adăugați cârlige în aceste locuri:
- în jurul și în cadrul proceselor majore,
- la construirea HTML de ieșire,
- pentru modificarea interogărilor posturilor sau bazei de date,
- înainte de a returna valori dintr-o funcție.
- Spațiul de nume numele cârligelor tale cu numele pluginului tău pentru a preveni conflictele de denumire.
- Încercați să treceți și alte variabile care sunt legate de cârlig, astfel încât alți oameni să obțină un context cu ceea ce se întâmplă în cârlig.
- Nu uitați să documentați cârligele pluginului dvs., astfel încât alte persoane să poată afla despre ele.
Lectură suplimentară
Iată câteva resurse dacă doriți să aflați mai multe despre extinderea pluginurilor:
- Cum să vă faceți extensibil pluginul WordPress, GitHub
Toate exemplele de cod din acest articol. - „Sfaturi utile pentru a începe cu WordPress Hooks”, Thomas Maier, Smashing Magazine
- „Cum se creează un plugin WordPress”, Daniel Pataki, Smashing Magazine
- „Hooks”, Manual pentru pluginuri, WordPress.org