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.

Utilizează Acțiuni și Filtre
Dacă crezi că oamenii ar dori să adauge sau să modifice unele date: furnizează apply_filters() înainte de a returna.
P.S. Un lucru pe care îl consider puțin dezamăgitor și pe care îl abordează întrebarea ta este procentul de plugin-uri care sunt concepute doar pentru utilizatorii finali, adică care nu au propriile hook-uri. Imaginează-ți dacă WordPress ar fi fost proiectat ca majoritatea plugin-urilor? Ar fi inflexibil și o soluție foarte de nișă.
Poate lucrurile ar fi diferite dacă WordPress ar avea capacitatea de a instala automat plugin-uri de care depind alte plugin-uri? În prezent, de obicei trebuie să scriu o mare parte din funcționalitatea de care am nevoie de la zero, pentru că clienții doresc anumite lucruri într-un anumit fel, iar plugin-urile disponibile, deși sunt 90% acolo, nu îmi oferă flexibilitatea de a actualiza restul de 10%.
Chiar îmi doresc ca cei care conduc comunitatea WordPress să identifice o modalitate de a asigura că plugin-urile sunt recompensate pentru urmarea celor mai bune practici (cum ar fi adăugarea de hook-uri pentru alți dezvoltatori), la fel cum răspunsurile bune sunt recompensate pe un site StackExchange.
Să luăm un exemplu din altă întrebare:
Exemplu: Vreau să fac ceva în plugin-ul meu când cineva redistribuie un articol. Dacă ar exista un hook personalizat în plugin-ul popular de redistribuire pe care să mă pot conecta și să declanșez, ar fi minunat. Nu există, așa că pot modifica plugin-ul lor pentru a-l include, dar asta funcționează doar pentru copia mea și nu vreau să încerc să o redistribui.
Legături conexe

Încărcarea scripturilor/CSS cu wp_enqueue_script
și wp_enqueue_style
Plugin-urile nu ar trebui să încarce/să încerce să încarce versiuni duplicate de fișiere JS/CSS, în special jQuery și alte fișiere JS incluse în WP Core.
Plugin-urile ar trebui să folosească întotdeauna wp_enqueue_script
și wp_enqueue_style
când leagă fișiere JS și CSS și niciodată direct prin tag-uri <script>
.
Legături relevante

Sugestie: Ar putea fi util să adăugați o mică notă despre utilizarea dependențelor acolo (deoarece face parte din sistemul de enqueue).

Corect, dar mai bine este să înregistrați stilurile și scripturile înainte și apoi să încărcați aceste scripturi prin ID. Acest lucru este foarte util pentru alți dezvoltatori să modifice scripturile sau să le folosească în pluginuri personalizate. De asemenea, este mai ușor să schimbați ordinea sau să creați un fișier sumar.

plus, Încărcați scripturile și stilurile doar pe paginile unde sunt necesare. http://scribu.net/wordpress/optimal-script-loading.html

Suport I18n
Toate șirurile de ieșire ar trebui să fie legate de un domeniu de text adecvat pentru a permite internaționalizarea de către părțile interesate, chiar dacă dezvoltatorul nu are interes să-și traducă propriul plugin.
Rețineți că este foarte important să încărcați fișierele de limbă în timpul acțiunii init
, astfel încât utilizatorul să se poată conecta la acțiune.
Consultați Codex: I18n pentru dezvoltatorii WordPress
Și de asemenea acest articol: Încărcarea corectă a fișierelor de limbă WP.
Începând cu WordPress 4.6+
WP 4.6 a schimbat ordinea de încărcare și locațiile verificate, ceea ce a făcut mult mai ușor pentru dezvoltatori și utilizatori.
Având în vedere un plugin cu un domeniu de text 'my-plugin', WordPress va căuta ACUM ÎNTÂI un fișier de traducere în:
/wp-content/languages/plugins/my-plugin-en_US.mo
Dacă nu găsește unul acolo, va căuta unul acolo unde pluginul îi spune să se uite (de obicei în folderul 'language' al pluginului dacă urmăriți codex-ul):
/wp-content/plugins/my-plugin/languages/my-plugin-en_US.mo
În cele din urmă, dacă nu este găsit niciun fișier de limbă, va verifica locația implicită:
/wp-content/languages/my-plugin-en_US.mo
Prima verificare a fost adăugată în 4.6 și oferă utilizatorilor un loc definit pentru a adăuga un fișier de limbă, deoarece înainte ar fi nevoie să știe unde dezvoltatorul a adăugat fișierul de limbă, acum utilizatorul trebuie doar să cunoască domeniul de text al pluginului: /wp-content/languages/plugins/TEXTDOMAIN-LOCAL.mo
Mai jos este vechiul mod (Nu este relevant începând cu WP 4.6+)
[...]
În cele din urmă, aș dori să subliniez că este important să încărcați fișierele de limbă personalizate ale utilizatorului din WP_LANG_DIR înainte de a încărca fișierele de limbă care vin cu pluginul. Atunci când sunt încărcate mai multe fișiere mo pentru același domeniu, prima traducere găsită va fi utilizată. În acest fel, fișierele de limbă furnizate de plugin vor servi ca o rezervă pentru șirurile netraduse de utilizator.
public function load_plugin_textdomain()
{
$domain = 'my-plugin';
// Filtrul "plugin_locale" este, de asemenea, utilizat în load_plugin_textdomain()
$locale = apply_filters( 'plugin_locale', get_locale(), $domain );
load_textdomain(
$domain,
WP_LANG_DIR . '/my-plugin/' . $domain . '-' . $locale . '.mo'
);
load_plugin_textdomain(
$domain,
FALSE,
dirname( plugin_basename(__FILE__) ) . '/languages/'
);
}

Pentru mine este cel mai important aspect. Nu implică multă muncă suplimentară, dar este unul dintre lucrurile care pot face pluginul tău mai util pentru milioanele de utilizatori care nu vorbesc engleza ca limbă maternă. Nu trebuie nici măcar să traduci tu vreun cuvânt, dar trebuie să pregătești totul pentru a putea fi tradus.

Asigură-te că Plugin-urile Nu Generează Erori cu WP_DEBUG
Testează întotdeauna plugin-urile tale cu WP_DEBUG
activat și, ideal, păstrează-l activ pe tot parcursul procesului de dezvoltare. Un plugin nu ar trebui să arunce NICI O eroare când WP_DEBUG
este activat. Aceasta include notificări de funcții învechite și indecși neverificați.
Pentru a activa depanarea, editează fișierul wp-config.php
astfel încât constanta WP_DEBUG
să fie setată la true
. Consultă Codex-ul despre Depanare pentru mai multe detalii.

Vezi te rog UPDATE-ul despre prezentarea unei singure bune practici pe răspuns; poți separa în mai multe răspunsuri?

Mulțumesc, și nu a fost vina ta, a fost a mea. Am revizuit întrebarea pentru a cere o singură bună practică pe răspuns, bazându-mă pe întrebarea lui @hakre despre duplicate și cum să fac asta să funcționeze.

Utilizează mai întâi funcțiile existente în nucleul WordPress
Dacă este posibil: folosește funcțiile existente incluse în nucleul WordPress în loc să scrii altele proprii. Dezvoltă funcții PHP personalizate doar atunci când nu există o funcție adecvată preexistentă în nucleul WordPress.
Unul dintre avantaje este că poți folosi "notificări de funcții depreciate" pentru a monitoriza ușor funcțiile care ar trebui înlocuite. Un alt avantaj este că utilizatorii pot consulta documentația funcției în Codex și pot înțelege mai bine ce face plugin-ul, chiar dacă nu sunt dezvoltatori PHP experimentați.
Articole conexe

Una dintre cele mai mari probleme aici este să afli că există deja o funcție potrivită. Ar fi util să existe un loc unde să poți posta codul și/sau nevoile de funcționalitate, pentru a permite comunității să comenteze cu privire la cea mai bună funcție de utilizat. Poate StackExchange ar putea fi folosit pentru asta?

Păi. Asta ar fi destul de greu și cred că ar fi un fel de sarcină fără sfârșit. Cred că extinderea codex-ului în acest fel ar fi cea mai bună soluție, deoarece acesta există deja.

Cred că extinderea codex-ului și eventual legături de acolo către thread-uri relevante de pe StackExchange ar fi suficient de bune.

Problema cu asta este că o mare parte din nucleu nu este conceput structural pentru reutilizare. Tocmai a trebuit să copiez și să modific ușor jumătate din funcțiile de manipulare a imaginilor/metadatelor pentru a-mi crea propriul tip de post care se comportă similar cu un atașament, doar pentru că o funcție ca downsize() apelează o altă funcție care include o verificare hardcodată pentru post-type='attachment'. Există multe exemple de genul, cum ar fi wp_count_posts() inflexibil fiind un alt exemplu. Înainte de a putea reutiliza cu adevărat nucleul, WordPress are nevoie de o refactorizare completă.

Dezinstalarea ar trebui să elimine toate datele unui plugin
La eliminarea dintr-o instalare WordPress, un plugin ar trebui să șteargă toate fișierele, folderele, intrările din baza de date și tabelele pe care le-a creat, precum și valorile opțiunilor adăugate.
Plugin-urile pot oferi o opțiune de export/import a setărilor, astfel încât acestea să poată fi salvate în afara WordPress înainte de ștergere.
Legături utile

Acesta ar trebui să fie comportamentul implicit, da, dar ar trebui să solicite și utilizatorului să păstreze unele date... ca atunci când dezinstalezi un joc video și te întreabă dacă dorești să elimini salvările și materialele descărcate. Un utilizator ar putea să dezactiveze plugin-ul doar în scop de testare și nu ar dori să treacă prin procesul de configurare a opțiunilor din nou la reactivare.

Vorbesc doar despre cazul în care un plugin este complet eliminat, nu atunci când este dezactivat.

Înțeleg asta... dar uneori voi șterge plugin-uri pentru a le putea adăuga manual din nou dintr-o copie de rezervă sau dintr-o versiune beta care nu este încă găzduită în depozit...

@EAMann: Pentru asta și pentru migrarea plugin-urilor pe alt server, un plugin ar trebui să ofere un mecanism de export și import al setărilor.

@MikeSchinkel: Terminat: http://wordpress.stackexchange.com/questions/715/objective-best-practices-for-plugin-development/925#925

Aceasta este adesea ignorat. Doar ieri am descoperit setări și tabele întregi care umflau baza mea de date. Este atât de enervant!

Nu sunt complet sigur dacă sunt de acord. Dacă plugin-ul își creează propriile tabele în baza de date, da, dar odată cu noile tipuri de postări personalizate folosite pentru orice, vom (sperăm) avea în curând plugin-uri care împărtășesc tipuri de postări și așa mai departe. Asta poate face ca 'ștergerea datelor' să fie o problemă destul de complicată.

Am văzut câteva plugin-uri care oferă un buton "Dezinstalare" în setările lor, cu avertismente mari roșii că va șterge toate datele. Acesta este separat de dezactivare și cred că este o modalitate excelentă de a gestiona situația. Nu toată lumea folosește butonul "Ștergere" pentru a elimina un plugin.

Deci, care este cea mai bună practică atunci când un plugin creează un tip personalizat de postare și introduce date în acel tip de postare? Ar trebui șterse acele date sau nu? Dacă nu, există vreun plugin pe care îl putem folosi ca ghid pentru implementarea aceluiași buton de 'dezinstalare'?

Prevenirea Injectării SQL cu Date de Intrare
Un plugin ar trebui să sanitizeze toate datele introduse de utilizator, obținute direct sau indirect (de exemplu prin $_POST
sau $_GET
) înainte de a folosi valorile introduse pentru a interoga baza de date MySQL.
Consultați: Formatarea declarațiilor SQL.

De asemenea, ar trebui să sanitizezi datele care ies din baza de date. Practic, nu aveți încredere niciodată în datele care nu sunt hardcodate. http://codex.wordpress.org/Data_Validation este o referință bună de asemenea.

Folosește o clasă și cod PHP orientat pe obiecte
Nu există niciun motiv să nu scrii cod PHP curat, orientat pe obiecte. PHP4 nu este suportat din 2008. Desigur, poți prefixa toate numele funcțiilor pentru a ajunge la nume_de_funcții_foarte_lungi_cu_multe_underscore-uri
, dar este mult mai ușor să scrii o simplă clasă și să grupezi totul în aceasta. De asemenea, pune clasa într-un fișier separat și numește-o corespunzător, astfel încât să poți extinde și întreține cu ușurință:
// în functions.php
require 'inc/class-my-cool-plugin.php';
new MyCoolPlugin();
// în inc/class-my-cool-plugin.php
class MyCoolPlugin {
function __construct() {
// adaugă filtre, wp_enqueue_script, etc.
// Pentru a atribui o metodă din clasă unei funcții WP
// fă ceva de genul acesta
add_action('admin_menu', [$this, "admin"]);
}
public function admin() {
// metode publice, pentru utilizare în afara clasei
// Reține că metodele utilizate în alte funcții WP
// (cum ar fi add_action) ar trebui să fie publice
}
private function somethingelse() {
// metode pe care le folosești doar în interiorul acestei clase
}
}

nu folosi new MyCoolPlugin(); cred că e mai bine să te conectezi în WP prin Hook: plugins_loaded

Nu sunt sigur de asta. Conform codex-ului, plugins_loaded este unul dintre primele lucruri încărcate, așa că cred că face puțină diferență dacă faci un construct ca acesta sau îl adaugi ca o acțiune.

este doar una dintre acele bune practici care fac totul mai frumos pentru toată lumea.

Din câte văd, adăugarea unui hook în plugins_loaded nu aduce nicio îmbunătățire și nu ar fi o practică recomandată, deoarece nu există beneficii; dimpotrivă, poate duce la o creștere a utilizării memoriei și la o scădere a vitezei, deoarece trebuie să parcurgă o acțiune în loc să adauge direct acțiunile. De asemenea, utilizarea OO nu ar trebui considerată o practică recomandată.

Există un consens privind modul de creare a obiectului, ar trebui să se facă prin hook sau nu?

Aceasta este o idee excelentă, dar trebuie să fiți atenți să vă asigurați că includeți fișierul clasei doar dacă serverul rulează PHP5. Consultați https://github.com/iandunn/WordPress-Plugin-Skeleton/blob/master/bootstrap.php pentru un exemplu.

Prefixează toate elementele din spațiul global
Un plugin ar trebui să prefixeze corespunzător TOATE elementele din spațiul global (constante, funcții, clase, variabile, chiar și lucruri precum taxonomii personalizate, tipuri de postări, widget-uri, etc.). De exemplu, nu creați o funcție numită init()
; în schimb, denumiți-o ceva de genul jpb_init()
.
Este recomandat să folosiți un prefix de trei sau patru litere în fața numelor sau să utilizați Funcția PHP Namespace. Comparați: Prefix de o singură literă pentru constantele de clasă PHP?
Legături utile

Dezactivarea nu ar trebui să provoace pierderea de date
Un plugin nu ar trebui șteargă vreo parte din datele sale în urma dezactivării.
Legături conexe

Anunțarea Pierderii de Date la Dezinstalarea Plugin-ului
La dezinstalare, un plugin ar trebui să anunțe utilizatorul că va șterge datele sale și să primească o confirmare că utilizatorul este de acord cu ștergerea datelor înainte de a o face. De asemenea, un plugin ar trebui să permită utilizatorului opțiunea de a păstra datele la dezinstalare. (Această idee aparține lui @EAMann.)
Legături relevante

WordPress-ul în sine afișează un mesaj de avertizare în panoul de administrare, că acest lucru se întâmplă (cel puțin în versiunea trunk în prezent).

Pe lângă mesajul de avertizare afișat de WordPress, este imposibil ca plugin-ul să solicite utilizatorului, deoarece în momentul dezinstalării acesta este deja dezactivat. Dar vezi ticket #20578.

Permiteți modificarea numelui folderului pluginului
/plugins/pluginname/{diverse}
Numele "pluginname" utilizat pentru folder ar trebui să poată fi întotdeauna schimbat.
Aceasta se realizează în mod normal prin definirea constantelor și utilizarea lor consecventă în întregul plugin.
Este inutil să spunem că multe pluginuri populare nu respectă această regulă.
Legături conexe:
plugins_url()
pentru legături ușoare către resursele incluse în plugin.

Redenumește folderul pluginului va provoca întreruperea actualizărilor automate, așa că nu sunt sigur că este cea mai bună soluție.

Va trebui să reactivezi pluginul după efectuarea modificării (schimbarea numelui va determina probabil dezactivarea pluginului), moment în care WordPress va recrea sau actualiza intrările corespunzătoare din baza de date legate de pluginuri (deci nu va întrerupe actualizările deloc).

Minimizează Numărul de Nume Adăugate în Spațiul Global
Un plugin ar trebui să reducă impactul său cât mai mult posibil prin minimizarea numărului de nume pe care le adaugă în spațiul global.
Aceasta poate fi realizată prin încapsularea funcțiilor plugin-ului într-o clasă sau prin utilizarea funcției PHP de namespace-uri. Prefixarea tuturor elementelor poate ajuta de asemenea, dar nu este la fel de flexibilă.
Pe lângă funcții și clase, un plugin nu ar trebui să introducă variabile globale. Utilizarea claselor elimină de obicei nevoia acestora și simplifică întreținerea plugin-ului.
Legături asociate

Poți să muți "nu ar trebui să introducă variabile globale" într-un răspuns separat? Acest aspect este înrudit, dar separat de întrebarea curentă și chiar aș vrea să dezbat acest subiect (atât pentru că cred că pot fi cazuri speciale în care nu sunt de acord, cât și pentru că vreau să învăț din opiniile altora.)

Folosește gestionarea erorilor încorporată în WordPress
Nu doar return;
dacă unele date introduse de utilizator sunt greșite. Oferă-le informații despre ce s-a făcut greșit.
function some_example_fn( $args = array() )
{
// Dacă valoarea nu a fost setată, construiește un mesaj de eroare
if ( ! isset( $args['some_value'] ) )
$error = new WP_Error( 'some_value', sprintf( __( 'Ai uitat să specifici %1$s pentru funcția ta. %2$s Eroare declanșată în %3$s la linia %4$s.', TEXTDOMAIN ), '$args[\'some_value\']', "\n", __FILE__, __LINE__ ) );
// oprește execuția & afișează mesajul de eroare & codul - doar pentru administratori!
if ( isset( $error ) && is_wp_error( $error ) && current_user_can( 'manage_options' ) )
wp_die( $error->get_error_code(), 'Eroare Temă: Argument Lipsă' );
// Altfel, dacă nu a fost declanșată nicio eroare, continuă...
}
O singură eroare (obiect) pentru toate
Poți configura un obiect global de eroare pentru tema sau pluginul tău în timpul inițializării:
function bootstrap_the_theme()
{
global $prefix_error, $prefix_theme_name;
// Ia numele temei ca ID de eroare:
$theme_data = wp_get_theme();
$prefix_theme_name = $theme_data->Name;
$prefix_error = new WP_Error( $theme_data->Name );
include // orice, etc...
}
add_action( 'after_setup_theme', 'bootstrap_the_theme' );
Ulterior poți adăuga nelimitat erori la cerere:
function some_theme_fn( $args )
{
global $prefix_error, $prefix_theme_name;
$theme_data = wp_get_theme();
if ( ! $args['whatever'] && current_user_can( 'manage_options' ) ) // o valoare necesară nesetată
$prefix_error->add( $prefix_theme_name, sprintf( 'Funcția %1$s necesită argumentul %2$s setat.', __FUNCTION__, '$args[\'whatever\']' ) );
// continuă funcția...
}
Apoi le poți colecta pe toate la sfârșitul temei tale. Astfel nu întrerupi randarea paginii și poți totuși afișa toate erorile pentru dezvoltare
function dump_theme_errors()
{
global $prefix_error, $prefix_theme_name;
// Nu ești administrator? SAU: Nu sunt erori?
if ( ! current_user_can( 'manage_options' ) ! is_wp_error( $prefix_error ) )
return;
$theme_errors = $prefix_error->get_error_messages( $prefix_theme_name );
echo '<h3>Erori Temă</h3>';
foreach ( $theme_errors as $error )
echo "{$error}\n";
}
add_action( 'shutdown', 'dump_theme_errors' );
Poți găsi informații suplimentare la această Întrebare. Un tichet legat de remedierea "colaborării" dintre WP_Error
și wp_die()
este legat de acolo și un alt tichet va urma. Comentariile, critica & altele sunt apreciate.

De ce instanțiezi un obiect WP_Error dacă doar accesezi proprietățile sale și nu treci niciodată instanța ca obiect?

@ProfK Am rescris codul să fie mai scurt și titlul/conținutul pentru wp_die();
era greșit (inversat). În legătură cu întrebarea ta) Nu înțeleg complet. Când creezi o instanță a clasei WP_Error, ai acces la toate datele sale prin funcții precum get_error_code();
, get_error_message();
, get_error_data();
și versiunile lor la plural. De asemenea, ai putea să o instantiezi o singură dată la inițializarea temei sau a plugin-ului și să folosești simplu $error->add();
pentru a adăuga alte erori, apoi să le afișezi în footer cu $error->get_error_messages();
pentru a le prinde pe toate.

@ProfK Voi posta actualizările viitoare la această întrebare. Momentan inspectez comportamentul clasei de eroare wp și vreau să scriu un ticket despre o API publică pentru erori în teme (schița este deja făcută). La finalul întrebării vei găsi un link către un alt ticket care aduce WP_Error
și wp_die()
mai aproape (are deja un patch). Orice comentariu, sugestie, critică sau altceva este binevenit.

Folosește Settings API înainte de add_option
În loc să adaugi opțiuni în baza de date prin funcția add_option, ar trebui să le stochezi ca un array folosind Settings API, care se ocupă de toate detaliile pentru tine.
Folosește Theme Modifications API înainte de add_option
Modifications API este o structură destul de simplă și o modalitate sigură de a adăuga și prelua opțiuni. Totul este salvat ca valoare serializată în baza ta de date. Simplu, sigur și ușor.

Și în plus, folosește update_option
și niciodată add_option
, funcția update va crea opțiunea atunci când aceasta nu există.. :)

Nu aș spune să nu folosești niciodată add_option
. Există un caz de utilizare bun pentru add_option
atunci când, dacă opțiunea este deja setată, aceasta nu este modificată, așa că o folosesc în activare pentru a păstra preferințele utilizatorilor care ar putea exista deja.

Comentarea folosind PhpDoc
Cea mai bună practică este apropiată de stilul PhpDoc. Dacă nu folosești un IDE precum "Eclipse", poți consulta manualul PhpDoc.
Nu este necesar să înțelegi exact cum funcționează. Dezvoltatorii profesioniști pot citi codul oricum și au nevoie doar de acest rezumat. Utilizatorii pasionați sau hobbyști ar putea aprecia modul în care explici la același nivel de cunoștințe.

Protejarea confidențialității utilizatorilor plugin-urilor
(Anterior: Comunicare API anonimă)
Dacă un plugin comunică cu un sistem extern sau un API (de exemplu, un serviciu web), acesta ar trebui să facă acest lucru în mod anonim sau să ofere utilizatorului o opțiune anonimă care să asigure că nicio dată legată de utilizatorul plugin-ului nu este transmisă unei terțe părți în mod necontrolat.

Găzduiește Plugin-uri pe WordPress.org
Folosește depozitul SVN oferit de WordPress.org pentru a găzdui plugin-uri. Acesta oferă o experiență mai ușoară de actualizare pentru utilizatori, iar dacă nu ai folosit niciodată SVN până acum, te va ajuta să-l înțelegi prin utilizarea într-un context care justifică acest lucru.

Asigurați Controlul Accesului Prin Utilizarea Permisiunilor
În multe cazuri, utilizatorii pot dori să nu permită accesul tuturor în zonele create de plugin-ul lor, mai ales în cazul plugin-urilor care efectuează multiple operații complexe. O singură verificare a capacității hardcodate poate să nu fie suficientă.
Cel puțin, asigurați-vă că aveți verificări adecvate ale capacității pentru toate tipurile de proceduri pentru care poate fi utilizat plugin-ul dumneavoastră.

Organizează-ți codul
Întotdeauna este dificil să citești un cod care nu este scris în ordinea în care este executat. Mai întâi include/require, definiții, wp_enqueue_style & _script, etc., apoi funcțiile de care are nevoie plugin-ul/tema și la final constructorul (de ex. ecranul de administrare, elemente care se integrează în temă, etc.).
Încearcă să separi lucruri precum CSS și JS în foldere proprii. De asemenea, încearcă să faci același lucru cu funcțiile care sunt doar ajutoare, precum aplatizări de array și altele asemănătoare. Păstrarea fișierului "principal" cât mai curat și ușor de citit este o modalitate care ajută utilizatorii, dezvoltatorii și pe tine, când încerci să actualizezi peste un an și nu ai mai văzut codul de mult timp.
De asemenea, este bine să ai o structură pe care o repeți des, astfel încât să-ți găsești întotdeauna drumul. Dezvoltarea într-o structură cunoscută pe diferite proiecte îți va oferi timp să o îmbunătățești și chiar dacă clientul tău trece la un alt dezvoltator, nu vei auzi niciodată "a lăsat un haos". Acest lucru îți construiește reputația și ar trebui să fie un obiectiv pe termen lung.

Mi-e teamă că acest lucru este prea mult despre stil, despre care oamenii ar putea dezbate, și nu despre cele mai bune practici obiective cu care toți cei respectați ar fi de acord. Este foarte important să abordăm doar cele mai bune practici obiective, astfel încât oamenii să fie dispuși să accepte să "binecuvânteze" lista, în loc să includem elemente controversate, indiferent cât de bine intenționate ar fi.

Import / Export Setări Plugin
Nu este ceva foarte comun între plugin-uri, dar dacă plugin-ul tău are (unele) setări, ar trebui să oferă funcționalități de Import / Export pentru date precum configurația și input-ul utilizatorului.
Importul/Exportul îmbunătățește utilizabilitatea unui plugin.
Un exemplu de plugin care are astfel de funcționalități de import și export (precum și un mecanism de undo) este Breadcrumb NavXT (Plugin Wordpress) (informație completă: conține câteva linii de cod scrise de mine, dar majoritatea au fost realizate de mtekk).
Legături Utile

Încheiere stilată
oprirea într-un mod decent
Toate funcțiile unui plugin (și chiar ale unei teme) ar trebui să utilizeze wp_die()
în locurile critice pentru a oferi utilizatorului câteva informații despre ce s-a întâmplat. Erorile PHP sunt enervante, iar wp_die
poate oferi utilizatorului un mesaj frumos stilizat despre ce a greșit pluginul (sau ei). În plus, dacă utilizatorul are depanarea dezactivată, pluginul pur și simplu se va opri.
Folosirea wp_die()
ajută și la asigurarea compatibilității pluginurilor/temelor dumneavoastră cu suita de teste WordPress.

Oferă ecrane de ajutor pentru utilizatori
Este mai drăguț să răspunzi RTFM (apasă ajutor) decât să răspunzi la aceeași întrebare de mai multe ori.
/**
* Adaugă ajutor contextual pentru acest ecran
*
* @param $rtfm
* @uses get_current_screen
*/
function ContextualHelp( /*string*/ $rtfm)
{
$current_screen = get_current_screen();
if ($current_screen->id == $this->_pageid)
{
$rtfm .= '<h3>WordPress Plugin - Ecranul A</h3>';
$rtfm .= '<p>Câteva sfaturi: donează-mi ' .
}
return $rtfm;
}
add_action('contextual_help', array($this,'ContextualHelp'),1,1);
actualizare / notă: (vezi comentariile de la kaiser): exemplul de mai sus trebuie utilizat într-o clasă

Ar trebui să fie în toolbox-ul fiecăruia (atâta timp cât trebuie să explici un ecran specific din interfața de administrare). +1

Oferă Formulare Extensibile
Când un plugin oferă posibilitatea de a introduce date, ar trebui să aibă întotdeauna un hook la final, chiar înainte de butonul "submit" și/sau "reset", astfel încât dezvoltatorii să poată extinde ușor formularul nu doar cu câmpuri, ci și cu butoane.
Vezi: Settings API
Conținut Relaționat

Includează întotdeauna funcțiile prin Hook, nu direct.
Exemplu:
Nu utiliza pentru a include clasa pluginului prin new fără hook
Folosește Hook-ul plugins_loaded
// adaugă clasa în WP function my_plugin_start() { new my_plugin(); } add_action( 'plugins_loaded', 'my_plugin_start' );
Actualizare: un mic exemplu live: Plugin-svn-trunk-page și un exemplu pseudo
//evită apelurile directe la acest fișier unde fișierele de bază wp nu sunt prezente
if (!function_exists ('add_action')) {
header('Status: 403 Forbidden');
header('HTTP/1.1 403 Forbidden');
exit();
}
if ( !class_exists( 'plugin_class' ) ) {
class plugin_class {
function __construct() {
}
} // sfârșitul clasei
function plugin_start() {
new plugin_class();
}
add_action( 'plugins_loaded', 'plugin_start' );
} // sfârșitul class_exists
De asemenea, poți încărca prin mu_plugins_loaded pe instalări multisite, vezi codex pentru referința acțiunilor: http://codex.wordpress.org/Plugin_API/Action_Reference Aici poți vedea, cum să incluzi WP cu acest hook: http://adambrown.info/p/wp_hooks/hook/plugins_loaded?version=2.1&file=wp-settings.php Eu folosesc acest lucru foarte des și nu este atât de greu și timpuriu, mai bine decât un hard new class();

@bueltige --- poți să explici puțin mai detaliat acest lucru

un mic exemplu live: [Plugin-svn-trunk-page]http://svn.wp-plugins.org/filter-rewrite-rules/trunk/filter-rewrite-rules.php și un exemplu pseudo
`//evită apelurile directe către acest fișier în absența fișierelor de bază wp if (!function_exists ('add_action')) { header('Status: 403 Forbidden'); header('HTTP/1.1 403 Forbidden'); exit(); }
if ( !class_exists( 'plugin_class' ) ) { class plugin_class {
function __construct() { }
} // sfârșitul clasei
function plugin_start() {
new plugin_class(); }
add_action( 'plugins_loaded', 'plugin_start' ); } // sfârșitul class_exists`

Descrierea plugin-ului tău ar trebui să detalieze în mod exact funcțiile acestuia. Există 10 plugin-uri pentru postări recomandate. Toate afișează postări recomandate, dar multe au caracteristici diferite. Ar trebui să fie ușor să compari plugin-ul tău cu plugin-uri similare prin citirea descrierii.
Ar trebui să eviți să te lauzi cât de simplu este plugin-ul tău, cu excepția cazului în care este într-adevăr foarte simplu. Ar trebui să incluzi link-uri utile în descriere, cum ar fi link-ul către setări.

Licențierea Plugin-urilor sub o Licență Compatibilă GPL
Plugin-urile și temele ar trebui să fie licențiate sub o licență compatibilă cu WordPress. Acest lucru le permite să fie redistribuite împreună cu WordPress ca un "program". O licență recomandată este GPL. Asigurați-vă că toate bibliotecile de cod incluse în plugin sunt compatibile cu aceeași licență.
(Acest lucru a fost o problemă și un subiect serios de dezbatere atât în trecut cât și în prezent.)

Să lăsăm deocamdată problema compatibilității cu GPL: http://core.trac.wordpress.org/ticket/14685

Minimizarea efectelor secundare ale surselor de date la distanță și serviciilor web
Un plugin ar trebui să memoreze în cache/protejeze serviciile web și/sau cererile XMLRPC/SOAP printr-un strat de caching/furnizor de date dacă le folosești, pentru a nu face ca cererile din frontend să aștepte răspunsul (lent) al serviciului web.
Aceasta include descărcarea fluxurilor RSS și a altor pagini. Proiectează plugin-urile tale astfel încât să solicite datele în fundal.
Un POSIBIL PAS este (luând ca exemplu postarea pe ping.fm): Creează o tabelă buffer, de exemplu: ping_fm_buffer_post( date, time, message, submitted_time, status )
- De fiecare dată când dorești să trimiți o actualizare pe ping.fm, adaug-o în această tabelă.
- Acum, trebuie să creăm un plugin pentru a gestiona aceste date. Acest plugin va rula prin crontab pentru a verifica fiecare actualizare care nu a fost încă trimisă
- Deoarece avem această tabelă, putem de asemenea lista fiecare mesaj trimis pe ping.fm și verifica starea fiecărui post. Doar în cazul în care există o problemă pe partea ping.fm, o putem retrimite.

Nu înțeleg exact unde vrei să ajungi cu asta. Poți oferi niște link-uri către materiale suport?

De asemenea, nu sunt sigur ce înseamnă exact "Net Overhead". Nu există un termen mai bun? Dacă este mai clar, va fi o regulă obiectivă mai bună. Și "Prevent" este imposibil; mai degrabă "Minimize"?

Folosește Standardele de Codare WordPress
http://codex.wordpress.org/WordPress_Coding_Standards
Știi cât de mult mai ușor este să actualizezi codul la care ai lucrat tu față de codul pe care l-a scris altcineva? Standardele de codare fac mai ușor pentru orice dezvoltator care lucrează la un proiect să înțeleagă rapid ce se întâmplă.
Știm că plugin-ul sau tema ta sunt ale tale, iar modul în care îți organizezi liniile și adaugi acoladele este o expresie a individualității tale. Fiecare indentare este o declarație atent gândită. Dar prin codul tău personalizat, contribui la WordPress, chiar dacă codul tău nu face parte din aplicația de bază. Standardele de codare ajută dezvoltatorii să înțeleagă mai repede codul tău.
