Practici Objektive Recomandate pentru Dezvoltarea de Plugin-uri?
Inițiem un wiki comunitar pentru a aduna cele mai bune practici obiective pentru dezvoltarea de plugin-uri. Această întrebare a fost inspirată de comentariile lui @EAMann pe wp-hackers.
Ideea este să colaborăm pentru a identifica cele mai bune practici obiective, astfel încât să le putem folosi într-un potențial proces de revizuire comunitar.
ACTUALIZARE: După primele răspunsuri, devine clar că trebuie să avem o singură idee/sugestie/best-practice per răspuns, iar utilizatorii ar trebui să verifice lista pentru a evita duplicatele înainte de a posta.

Testează-ți pluginul
Ar trebui să avem cu siguranță câteva instrumente de testare în mediul de dezvoltare al pluginului nostru.
Bazat pe acest răspuns al lui Ethan Seifert la o întrebare despre testare, acestea sunt bune practici de urmat:
- Testele Unitare ar trebui să testeze cea mai mică cantitate de comportament pe care o poate realiza o clasă.
- Când ajungi la nivelul testării funcționale, aici poți testa codul cu dependențele WordPress.
- În funcție de ce face pluginul tău – ia în considerare utilizarea testelor bazate pe Selenium care verifică prezența datelor în DOM folosind ID-uri

Deși testarea este importantă, a spune că testele unitare ar trebui să testeze cele mai mici în loc de cele mai mari aspecte pare neînțelept. Dacă ai dificultăți în testarea problemelor dependente de WordPress, atunci pur și simplu aprofundează-te în nucleul WordPress, vei găsi o mulțime de variabile globale interne pe care le poți folosi pentru a verifica dacă elementele au funcționat.

Dar acoperirea celor mai mici aspecte mai întâi este de bază, astfel încât să poți ajunge la testarea funcțională cu WordPress, așa cum răspunde întrebarea, nu-i așa?

Grijă pentru versiunile viitoare de WordPress și teme
Notă: După ce am recitit acest sfat, acum mă distanțez de această practică, deoarece verificarea fiecărei funcții pentru existență poate încetini site-ul tău.
Verifică dacă funcțiile sunt învechite direct în tema ta.
Acesta este un exemplu "care ar putea arăta așa".
if ( ! function_exists( 'wp_some_fn' ) )
{
$theme_data = wp_get_theme();
$error = new WP_Error( 'wp_some_fn', sprintf( __( 'Funcția %1$s este învechită. Te rugăm să informezi autorul', TEXTDOMAIN ), "Tema: {$theme_data->Name}: Versiunea {$theme_data->Version}" );
// întrerupe
if ( is_wp_error( $error ) )
return print $error->get_error_message();
}
// altfel dacă nu există eroare - funcția funcționează și există
wp_some_fn();
Pentru gestionarea corectă/cea mai bună practică a erorilor, vezi acest răspuns: link
Poți adăuga chiar și $cause în funcție. Acest lucru te va ajuta pe tine și utilizatorii tăi să țină pasul cu funcțiile sau clasele din tema ta care s-ar putea schimba.

Folosește Denumiri Adecvate
Denumește hook-urile și filtrele (clasele, funcțiile și variabilele), astfel încât oamenii să le poată identifica chiar și peste un an, când nu-și mai amintesc de unde vine acea bucățică de cod. Nu contează dacă numele hook-urilor/filtrelor devin lungi. Ex. numeletauunic_hook/filter_ceface.
- Dacă fișierul tău conține o clasă numită "dbdbInit", atunci fișierul care conține clasa ar trebui să se numească "
dbdbInit.class.php
". - Dacă ai în interiorul clasei
dbdbInit
o funcție care înregistrează, de exemplu, custom_post_types, atunci numește-oregister_custom_post_types()
. - Dacă ai un array care conține numele pentru custom_post_types, atunci numește variabila în care este asignat array-ul
$custom_post_type_names
. - Dacă ai o funcție care gestionează un array, scrie
function array_handler( $array ) { // gestionează array-ul}
.. - Încearcă pur și simplu să denumești lucrurile într-un mod în care să știi ce face semnul/unde aparține după numele său.
Alt lucru: Dacă trebuie să debug-uiți, atunci, în 99% din cazuri, veți primi toate mesajele nu doar pentru codul vostru, ci și pentru WordPress. Așadar, încercați să folosiți același prefix, de exemplu "dbdb
", pentru clasele, funcțiile publice și variabilele/obiectele voastre. Astfel, le puteți găsi cu ușurință între sute de fișiere. (WordPress încarcă 64 de fișiere înaintea temei tale și aproximativ 1.550 de funcții, fără a vorbi despre hook-uri și filtre.)

Nu am o idee clară despre ce înseamnă acest lucru. Prima propoziție nu este completă. Acest text trebuie rescris și clarificat.

este bine să respectăm standardele WordPress atunci când denumim fișierele și funcțiile, de exemplu "class-db-init.php" http://codex.wordpress.org/WordPress_Coding_Standards

Decuplează-te de codul de bază al WordPress
Un Plugin ar trebui să reducă impactul API-ului WordPress la minimul necesar pentru a separa codul plugin-ului de cel al WordPress. Acest lucru reduce impactul modificărilor din codul de bază al WordPress asupra plugin-ului. În plus, îmbunătățește compatibilitatea între versiuni a codului plugin-ului tău.
Acest lucru nu înseamnă să nu folosești funcțiile WordPress (folosește-le, așa cum sugerează Reutilizează funcțiile existente), ci să nu-ți împletești codul prea mult cu funcțiile WordPress, ci să separi logica de afaceri a plugin-ului tău de funcționalitățile WordPress.

Am dificultăți cu formularea acesteia. Vrei să spui că un plugin ar trebui să folosească API-ul WordPress ori de câte ori este posibil, în loc să acceseze direct tabelele SQL și/sau variabilele globale?

Ei bine. Odată a trebuit să lucrăm cu date de formular într-un proiect, așa că am accesat $_REQUEST. Apoi au schimbat modul în care se face slash-ul în interiorul acestuia. Deci, în loc să folosiți $_REQUEST, utilizați o funcție care are un singur apel către $_REQUEST pentru întregul plugin. În cazul în care modul de slash se schimbă, doar această funcție trebuie modificată. Acest lucru nu este împotriva utilizării API-ului WordPress, ci pentru a decupla pluginul de acesta, astfel încât să puteți reacționa mai bine la modificările din nucleul WP. Acest lucru vă ajută să vă mențineți pluginurile pe termen lung. Pentru un simplu gadget, acest lucru nu este necesar.

Fiind dezvoltator intermitent timp de 23 de ani, am văzut multe cicluri și multe practici recomandate care au venit și au dispărut. Am văzut pendulul oscilând amplu în ambele direcții. Acum cred în moderație. În primii mei ani, am abstractizat totul, dar am învățat că abstractizarea adaugă complexitate care este adesea mai rea decât beneficiul așteptat. Când vedem ceva care ne provoacă probleme ca oameni, imediat căutăm modalități de a ne proteja de el în viitor, dar adesea medicina este mai dăunătoare decât boala. În SUA, Sarbanes-Oxley este un exemplu în acest sens.

Obișnuiam să cred că variabilele globale sunt pur și simplu rele. Apoi am lucrat cu WordPress și, știi ce, ele au avantajele lor atunci când sunt folosite cu moderație. Aș putea scrie o carte pe acest subiect (deși nu am de gând s-o fac; prea multă muncă pentru prea puțină răsplată.) Unde consider acum că stăm? Simplitatea are cea mai mare valoare. Probabil că e mai bine să nu abstractizezi și apoi doar să rezolvi problemele atunci când și dacă apar, decât să petreci mult mai mult timp în teamă că ar putea apărea. Așa că am tendința să votez împotriva acesteia.

Doar din întrebarea scurtă pe care am pus-o pe wp-hackers: Ei te urăsc dacă folosești variabile globale precum $wp_taxonomies
, pentru că sunt "interne" (știu că există unele care ar trebui folosite, cum ar fi $wp_query
sau $post
)...

@kaiser - Fie ceva este intern, fie schimbarea va rupe compatibilitatea înapoi. Atât despre namespace-ul global în WordPress.

@hakre: Cine a spus ceva despre modificare? Preluarea și folosirea datelor din asta e ceea ce discut. Nu există întotdeauna o funcție care să facă exact ce ai nevoie și înainte să ajung să scriu interogări SQL personalizate, pur și simplu le folosesc.

@kaiser: Modificare în sensul că datele din aceste variabile se vor schimba. Sau chiar tu ai vrut să modifici date în array-uri globale? ;) Este un economisor de timp incredibil. Chiar dacă lucrurile se strică cu o nouă versiune, e ușor de reparat.

@hakre: Nu, nu mă joc/încurc în datele care sunt furnizate de variabilele globale $vars. Și da: mai bine să mergi pe această cale și să se strice într-o versiune viitoare decât să te încurci cu 5 funcții care ar putea fi, de asemenea, depreciate (și fără să fie marcate ca atare) și apoi să le repari mai târziu în 5 minute. Economie de timp: +1.

Folosește opțiunile WordPress pentru șirurile de ieșire ale pluginului
Pentru a face pluginul ușor de utilizat și personalizat, toate șirurile de ieșire ar trebui să fie modificabile. Cea mai bună metodă pentru a realiza acest lucru este utilizarea opțiunilor WordPress pentru a stoca șirurile de ieșire și a oferi o interfață de administrare pentru a modifica valorile implicite. Pluginul nu ar trebui să utilizeze șiruri afișate care nu pot fi ușor schimbate folosind panoul de administrare al pluginului.
De exemplu: Sociable - îți oferă posibilitatea de a schimba fraza care apare înaintea părții cu iconițe "împărtășește și bucură-te:"

Ce este exact un "șir de plugin"? Puteți oferi exemple de cazuri de utilizare? De asemenea, vă rugăm să scrieți în propoziții complete, astfel încât acesta să poată fi o resursă mai valoroasă.

Dacă aveți internaționalizare, acest lucru ar trebui să fie redundant.

Nu sunt de acord. Face lucrurile mai ușoare pentru utilizatorii finali, dar mai dificile pentru dezvoltatori. După cum a spus Raphael, ar trebui folosită i18n în schimb.

Folosește hook-uri pentru dezinstalare, activare și dezactivare
Există trei hook-uri diferite pentru aceasta:
- Dezinstalare
register_uninstall_hook();
- Dezactivare
register_deactivation_hook();
- Activare
register_activation_hook();
O instrucțiune detaliată cu un exemplu funcțional poate fi găsită aici..
