Practici Objektive Recomandate pentru Dezvoltarea de Plugin-uri?

23 aug. 2010, 06:53:13
Vizualizări: 18K
Voturi: 138

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.

3
Comentarii

Nu înțeleg cu adevărat cum ar trebui să funcționeze wiki-ul comunitar pe acest site (și pe celelalte) în mod corect cu SE, dar poate aceasta este o întrebare pentru meta. Va aduna doar în mare parte răspunsuri duplicate.

hakre hakre
23 aug. 2010 14:57:34

@hakre: Foarte bun punctul tău. După ce am văzut asta, voi adăuga în descriere că oamenii ar trebui să adauge doar o idee per "răspuns" și voi modifica răspunsul meu existent pentru a fi mai multe răspunsuri.

MikeSchinkel MikeSchinkel
23 aug. 2010 19:21:00

Lectură recomandată: Top 10 cele mai comune greșeli în plugin-urile Wordpress

Sisir Sisir
4 dec. 2013 12:01:48
Toate răspunsurile la întrebare 30
0
74

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

23 aug. 2010 16:03:04
3
55

Î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

23 aug. 2010 11:56:05
Comentarii

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

t31os t31os
17 feb. 2011 20:26:09

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.

bueltge bueltge
20 sept. 2012 00:35:58

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

M-R M-R
12 dec. 2012 11:38:41
2
50

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/' 
    );
}
23 aug. 2010 19:53:02
Comentarii

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.

2ndkauboy 2ndkauboy
29 aug. 2010 23:23:17

Este un lucru atât de valoros și totuși ușor de făcut, am vrut doar să spun că sunt de acord și că fiecare autor de pluginuri ar trebui să facă acest lucru.

t31os t31os
17 feb. 2011 20:23:23
4
48

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.

23 aug. 2010 16:08:31
Comentarii

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

MikeSchinkel MikeSchinkel
23 aug. 2010 19:36:25

Sigur, nicio problemă. Îmi cer scuze pentru asta.

John P Bloch John P Bloch
23 aug. 2010 20:02:30

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.

MikeSchinkel MikeSchinkel
23 aug. 2010 21:32:13

Dacă aș putea vota de două ori acest răspuns, aș face-o. Este atât de frustrant când lucrez la un site de dezvoltare și trebuie să dezactivez WP_DEBUG pentru că un plugin de care am nevoie aruncă avertismente și notificări peste tot.

Ian Dunn Ian Dunn
28 aug. 2012 19:04:19
5
42

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

24 aug. 2010 09:43:32
Comentarii

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?

MikeSchinkel MikeSchinkel
25 aug. 2010 23:20:29

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.

kaiser kaiser
27 aug. 2010 09:53:03

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

kaiser kaiser
28 aug. 2010 02:49:01

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ă.

wyrfel wyrfel
16 feb. 2011 12:04:23

De acord în totalitate cu asta. Exemplul meu preferat de tot timpul: wp-login.php. Așadar, "Dacă poți" a fost un bun început pentru răspuns...

kaiser kaiser
16 feb. 2011 12:08:50
11
35

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

23 aug. 2010 07:07:13
Comentarii

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.

EAMann EAMann
23 aug. 2010 17:24:35

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

Travis Northcutt Travis Northcutt
23 aug. 2010 19:33:02

Î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 EAMann
23 aug. 2010 21:29:28

@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.

hakre hakre
24 aug. 2010 12:18:11

@hakre - Import/Export: sună ca o altă practică recomandată?

MikeSchinkel MikeSchinkel
26 aug. 2010 10:06:17

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

Raphael Raphael
15 nov. 2010 13:17:04

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ă.

wyrfel wyrfel
16 feb. 2011 12:23:00

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.

gabrielk gabrielk
21 iun. 2011 19:20:43

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'?

urok93 urok93
13 aug. 2012 19:31:45

Trebuie să nu sunt de acord cu asta. Un buton de dezinstalare în plugin este minunat, dar simpla ștergere a pluginului nu ar trebui să declanșeze modificări în baza de date fără o mulțime de avertizări.

Ben Miller Ben Miller
17 aug. 2013 23:07:10
Arată celelalte 6 comentarii
1
34

Prevenirea Injectării SQL cu Date de Intrare

Un plugin ar trebuisanitizeze 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.

23 aug. 2010 19:25:59
Comentarii

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.

Ian Dunn Ian Dunn
21 iun. 2011 01:57:10
7
31

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
    }
}
1 sept. 2010 17:58:59
Comentarii

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

bueltge bueltge
15 oct. 2010 15:54:05

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.

Husky Husky
16 oct. 2010 00:07:25

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

Arlen Beiler Arlen Beiler
19 oct. 2010 05:01:39

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ă.

Backie Backie
16 feb. 2011 12:46:10

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

urok93 urok93
13 aug. 2012 19:32:36

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.

Ian Dunn Ian Dunn
28 aug. 2012 19:07:16

@IanDunn: dacă dorești suport pentru PHP4, dar suportul pentru PHP4 a fost întrerupt din 2008, acum peste 4 ani. Nu există niciun motiv să mai folosești verificări specifice PHP4.

Husky Husky
29 aug. 2012 16:42:54
Arată celelalte 2 comentarii
1
31

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

23 aug. 2010 20:02:55
Comentarii

Aș folosi funcțiile globale foarte rar, chiar și atunci când sunt prefixate. În schimb, aș folosi clase cu un namespace. Dacă dorești să ai funcții utilitare/de șablon, poți folosi o funcție statică într-o clasă.

Husky Husky
1 sept. 2022 13:21:28
0
26

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

23 aug. 2010 07:27:17
0
23

Includează doar fișierele de care ai nevoie...

Dacă ești în partea de front end, nu include cod care se referă la zona de administrare.

14 ian. 2011 00:05:25
2
21

Anunțarea Pierderii de Date la Dezinstalarea Plugin-ului

La dezinstalare, un plugin ar trebuianunț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 trebuipermită utilizatorului opțiunea de a păstra datele la dezinstalare. (Această idee aparține lui @EAMann.)

Legături relevante

23 aug. 2010 19:29:33
Comentarii

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).

hakre hakre
24 aug. 2010 12:06:18

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.

J.D. J.D.
20 mar. 2015 15:00:57
3
19

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.
24 oct. 2010 19:45:38
Comentarii

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

mtekk mtekk
14 ian. 2011 07:53:29

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).

t31os t31os
17 feb. 2011 20:34:50

În loc să folosești o constantă, utilizează plugin_basename(__FILE__) pentru a determina numele local al pluginului. Acest lucru este util și pentru a avea copii ale aceluiași plugin (pentru testare, conturi multiple în alte părți dar doar unul per plugin, ...).

Raphael Raphael
12 mar. 2011 00:23:52
1
19

Minimizează Numărul de Nume Adăugate în Spațiul Global

Un plugin ar trebuireducă 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

23 aug. 2010 23:23:13
Comentarii

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.)

MikeSchinkel MikeSchinkel
25 aug. 2010 22:57:05
3
19

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.

3 mai 2011 18:07:57
Comentarii

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

ProfK ProfK
28 oct. 2011 09:03:19

@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.

kaiser kaiser
28 oct. 2011 14:01:24

@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.

kaiser kaiser
28 oct. 2011 21:00:29
3
17

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.

29 aug. 2010 17:24:35
Comentarii

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

t31os t31os
17 feb. 2011 20:32:29

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.

ProfK ProfK
28 oct. 2011 08:47:24

Un alt caz de utilizare pentru add_option este atunci când dorești să dezactivezi explicit auto-loading-ul. update_option va forța autoload-ul să fie true, deci dacă dorești să dezactivezi autoload-ul, folosește add_option atunci când creezi inițial opțiunea.

Dave Romsey Dave Romsey
26 iul. 2012 08:24:37
0
17

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.

25 aug. 2010 01:21:26
0
16

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.

23 aug. 2010 17:39:12
0
15

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.

25 aug. 2010 22:15:36
0
15

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ă.

25 aug. 2010 22:41:48
1
12

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.

25 aug. 2010 01:32:12
Comentarii

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.

MikeSchinkel MikeSchinkel
26 aug. 2010 09:55:49
0
12

Import / Export Setări Plugin

Nu este ceva foarte comun între plugin-uri, dar dacă plugin-ul tău are (unele) setări, ar trebuioferă 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

26 aug. 2010 11:19:50
0
11

Î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.

Legături utile:
24 aug. 2010 09:40:19
2
11

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ă

18 feb. 2011 03:15:10
Comentarii

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

kaiser kaiser
18 feb. 2011 16:58:50

Apropo: Ar trebui să menționezi că acest cod este menit să fie parte dintr-o Clasă și cum să interacționezi cu $this->_page_id & cum ar arăta dacă ai adăuga action hook dintr-un fișier functions.php sau dintr-un fișier de plugin fără o Clasă.

kaiser kaiser
18 feb. 2011 18:07:30
0
10

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

24 aug. 2010 02:10:57
3

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();

15 oct. 2010 16:06:02
Comentarii

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

NetConstructor.com NetConstructor.com
13 feb. 2011 03:06:26

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`

bueltge bueltge
14 feb. 2011 23:11:00

@Netconstructor.co - am actualizat thread-ul, comentariul este urât pentru cod

bueltge bueltge
14 feb. 2011 23:14:57
0

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.

30 aug. 2010 06:41:47
1

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.)

23 aug. 2010 19:53:21
Comentarii

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

hakre hakre
25 aug. 2010 23:13:49
3

Minimizarea efectelor secundare ale surselor de date la distanță și serviciilor web

Un plugin ar trebuimemoreze î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 )

  1. De fiecare dată când dorești să trimiți o actualizare pe ping.fm, adaug-o în această tabelă.
  2. 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ă
  3. 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.
23 aug. 2010 23:30:13
Comentarii

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

MikeSchinkel MikeSchinkel
25 aug. 2010 22:39:08

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"?

MikeSchinkel MikeSchinkel
25 aug. 2010 23:03:00

Ai (probabil) dreptate. Formulare nepotrivită și "prevenire" nu este niciodată posibilă, "minimizare" se potrivește mai bine.

hakre hakre
25 aug. 2010 23:05:43
0

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.

21 iun. 2011 19:40:14