Best practice oggettive per lo sviluppo di plugin? [chiuso]


135

Avvio di un wiki della comunità per raccogliere best practice oggettive per lo sviluppo di plugin. Questa domanda è stata ispirata dai commenti di @ EAMann sugli hacker di wp .

L'idea è di collaborare su quali potrebbero essere le migliori pratiche oggettive in modo da poterle eventualmente utilizzare in alcuni processi di revisione della collaborazione della comunità.

AGGIORNAMENTO: Dopo aver visto le prime risposte diventa chiaro che dobbiamo avere solo un'idea / suggerimento / best practice per risposta e le persone dovrebbero rivedere l'elenco per assicurarsi che non ci siano duplicati prima di pubblicare.


Non capisco davvero come la wiki della comunità dovrebbe funzionare correttamente su questo (e gli altri) con SE, ma forse questa è una domanda su meta. Accumulerà per lo più solo duplicati nelle risposte.
Hakre,

@hakre: ottimo punto. Dopo aver visto cosa aggiungerò alla descrizione che le persone dovrebbero aggiungere solo un'idea per "risposta" e cambierò la mia risposta esistente in più risposte.
MikeSchinkel,

Risposte:


72

Usa azioni e filtri

Se ritieni che le persone vorrebbero aggiungere o modificare alcuni dati: fornisci apply_filters () prima di tornare .

PS Una cosa che trovo un po 'deludente e che la tua domanda riguarda la percentuale di plugin progettati solo per gli utenti finali, cioè che non hanno hook propri. Immagina se WordPress fosse progettato come la maggior parte dei plugin? Sarebbe inflessibile e una soluzione di nicchia.

Forse le cose sarebbero diverse se WordPress avesse la possibilità di installare automaticamente plugin da cui dipendevano altri plugin? Dato che in genere devo scrivere molte funzionalità di cui ho bisogno da zero perché i clienti vogliono le cose in un certo modo e i plugin disponibili, mentre il 90% lì, non mi consente la flessibilità di aggiornare il restante 10%.

Vorrei davvero che coloro che guidavano la community di WordPress identificassero un modo per garantire che i plug-in venissero premiati per aver seguito le migliori pratiche (come l'aggiunta di hook per altri sviluppatori) proprio come le buone risposte sono ricompensate su un sito StackExchange.

Facciamo un esempio da un'altra domanda :

Esempio: voglio fare qualcosa nel mio plugin quando qualcuno ritwittano un articolo. Se ci fosse un gancio personalizzato in qualunque sia il popolare plug-in di retweet su cui potrei collegarmi e sparare, sarebbe fantastico. Non esiste, quindi posso modificare il loro plugin per includerlo, ma funziona solo per la mia copia e non voglio provare a ridistribuirlo.

Relazionato


55

Carica script / CSS con wp_enqueue_scriptewp_enqueue_style

I plugin non devono caricare / tentare di caricare versioni duplicate dei file JS / CSS, in particolare jQuery e altri file JS inclusi in WP Core.

I plugin dovrebbero sempre usare wp_enqueue_scripte wp_enqueue_stylequando si collegano file JS e CSS e mai direttamente tramite <script>tag.

Relazionato


1
Suggerimento : potrebbe valere la pena attaccare una piccola nota sull'uso delle dipendenze (poiché fa parte del sistema di accodamento).
t31os,

Giusto, ma è meglio che prima registri gli stili e gli script e poi accoda questi script tramite ID. Questo è molto utile per gli altri sviluppatori per modificare gli script o utilizzarli nei plugin personalizzati. È anche più facile cambiare l'ordine o creare un file estivo.
bueltge,

2
inoltre, carica script e stili sulle pagine dove richiesto. scribu.net/wordpress/optimal-script-loading.html
MR

49

Supporto I18n

Tutte le stringhe di output devono essere collegate a un dominio di testo appropriato per consentire l'internazionalizzazione da parte delle parti interessate, anche se lo sviluppatore non ha interesse a tradurre il proprio plug-in.

Si noti che è molto importante caricare i file della lingua durante l' initazione in modo che l'utente possa agganciarsi all'azione.

Vedi il codice: I18n per sviluppatori WordPress

E anche questo articolo: caricamento corretto dei file in lingua WP .

Da WordPress 4.6+

WP 4.6 ha cambiato l'ordine di caricamento e le posizioni controllate, lo ha reso molto più semplice per sviluppatori e utenti.

Considerando un plug-in con un dominio di testo "my-plugin", WordPress cercherà ora PRIMA di cercare un file di traduzione in:
/wp-content/languages/plugins/my-plugin-en_US.mo

Se non riesce a trovarne uno, ne cercherà uno in cui il plug-in gli dice di apparire (normalmente nella cartella 'language' di Pluigns se segue il codice):
/ wp-content / plugins / my-plugin / languages ​​/ my- plugin-en_US.mo

Infine, se non viene trovato alcun file di lingua, verrà controllata la posizione predefinita di:
/wp-content/languages/my-plugin-en_US.mo

Il primo controllo è stato aggiunto in 4.6 e offre agli utenti un posto definito per aggiungere un file di lingua, poiché prima avrebbero dovuto sapere dove lo sviluppatore aveva aggiunto il file di lingua, ora l'utente deve solo conoscere il dominio di testo del plugin: / wp-content / lingue / plugins / TEXTDOMAIN-LOCAL.mo


Di seguito è riportato il vecchio modo (non pertinente dal WP 4.6+)

[...]
Infine, vorrei sottolineare che è importante caricare file di lingua utente personalizzati da WP_LANG_DIR prima di caricare i file di lingua forniti con il plug-in . Quando vengono caricati più file mo per lo stesso dominio, verrà utilizzata la prima traduzione trovata. In questo modo i file di lingua forniti dal plugin serviranno da fallback per le stringhe non tradotte dall'utente.

public function load_plugin_textdomain()
{
    $domain = 'my-plugin';
    // The "plugin_locale" filter is also used in 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/' 
    );
}

Per me il più importante. Non è molto lavoro extra per farlo, ma una delle cose che puoi rendere il tuo plugin più utile per i milioni di utenti che non parlano inglese come prima lingua. Non devi nemmeno tradurre nessuna parola da solo, ma preparare tutto per essere tradotto.
2ndkauboy,

Questa è una cosa così preziosa, ma facile da fare, volevo solo dire che sono d'accordo e che ogni autore di plugin dovrebbe farlo.
t31os,

48

Assicurati che i plugin non generino errori con WP_DEBUG

Metti sempre alla prova i tuoi plug-in con l'opzione WP_DEBUGattivata e idealmente li hai attivati ​​durante tutto il processo di sviluppo. Un plugin non dovrebbe generare QUALSIASI errore con WP_DEBUGon. Ciò include avvisi obsoleti e indici non controllati.

Per attivare il debug, modifica il wp-config.phpfile in modo che la WP_DEBUGcostante sia impostata su true. Vedi il Codice su Debug per maggiori dettagli.


Si prega di consultare l'aggiornamento per avere solo le migliori pratiche per risposta; puoi dividere in più risposte?
MikeSchinkel,

Certo nessun problema. Mi dispiace per quello.
John P Bloch,

Grazie, e non era la tua svista, era mia. Ho rivisto la domanda per chiedere una migliore pratica per risposta basata sulla domanda di @hakre sui duplicati e su come farlo funzionare.
MikeSchinkel,

6
Se potessi votare questa risposta due volte, lo farei. È così frustrante quando sto lavorando su un sito di sviluppo e devo disattivare WP_DEBUG perché un plugin che devo usare sta emettendo avvisi e avvisi ovunque.
Ian Dunn,

42

Primo utilizzo delle funzioni esistenti in WordPress Core

Se puoi: usa le funzioni esistenti incluse nel core di WordPress invece di scriverne di tue. Sviluppa funzioni PHP personalizzate solo quando non esiste una funzione preesistente appropriata nel core di WordPress.

Uno dei vantaggi è che è possibile utilizzare "avvisi obsoleti di registro" per monitorare facilmente le funzioni che devono essere sostituite. Un altro vantaggio è che gli utenti possono visualizzare la documentazione delle funzioni nel Codex e comprendere meglio cosa fa il plugin anche se non sono sviluppatori PHP esperti.

Relazionato


Uno dei maggiori problemi qui è imparare che esiste una funzione esistente adeguata. Ciò che sarebbe utile sarebbe un posto dove pubblicare il codice e / o le funzionalità necessarie per consentire alla comunità di commentare quale funzione utilizzare al meglio. Forse StackExchange potrebbe essere usato per questo?
MikeSchinkel,

Puh. Sarebbe piuttosto difficile e immagino una sorta di compito senza fine. Penso che estendere il codice in questo modo sarebbe meglio, perché esiste già.
Kaiser

Immagino che l'estensione del codice e forse il collegamento da lì ai relativi thread di scambio di borsa sarebbe abbastanza buono.
Kaiser

4
Un problema è che molti core non sono strutturalmente progettati per la riusabilità. Ho dovuto solo copiare e modificare leggermente la metà delle funzioni di manipolazione / metadati dell'immagine per creare il mio post-type comportamentale simile ad un allegato, solo perché una funzione come downsize () chiama una funzione che include un controllo codificato per post-type = 'allegato '. Ce ne sono molti come l'inflessibile wp_count_posts () che è un altro esempio. Prima di poter veramente riutilizzare il core WP ha bisogno di un refactoring completo.
Wyrfel,

Completamente d'accordo su questo. Il mio esempio preferito di tutti i tempi: wp-login.php. Quindi, "Se puoi" è stato un buon inizio per la risposta ...
Kaiser

35

La disinstallazione dovrebbe rimuovere tutti i dati di un plugin

Dopo essere stato rimosso da un'installazione di WordPress, un plug-in dovrebbe eliminare tutti i file, le cartelle, le voci del database e le tabelle che ha creato, nonché i valori delle opzioni che ha creato.

I plugin possono offrire un'opzione per esportare / importare le impostazioni, in modo che le impostazioni possano essere salvate al di fuori di WordPress prima della cancellazione.

Relazionato


4
Questo dovrebbe essere il comportamento predefinito, sì, ma dovrebbe anche chiedere all'utente di conservare alcuni dati ... come quando si disinstalla un videogioco ti chiede se vuoi rimuovere i giochi salvati e il materiale scaricato. Un utente potrebbe disattivare il plug-in solo a scopo di test e non vorrebbe tornare indietro impostando le opzioni quando lo riattiva.
EAMann,

1
Sto parlando solo quando un plugin è completamente rimosso, non quando è disattivato.
Travis Northcutt,

2
Lo capisco ... ma a volte eliminerò i plug-in in modo da poterli aggiungere nuovamente manualmente da una versione di backup o beta che non è ancora ospitata nel repository ...
EAMann

4
@EAMann: per questo e per la migrazione dei plugin su un altro server, un plugin dovrebbe fornire un meccanismo per esportare e importare le impostazioni.
Hacre,

2
Ho visto alcuni plugin offrire un pulsante "Disinstalla" nelle loro impostazioni con grandi avvisi rossi che cancellerà tutti i dati. Questo è separato dalla disattivazione e penso che sia un ottimo modo per gestirlo. Non tutti usano il pulsante "Elimina" per rimuovere un plugin.
gabrielk,

34

Prevenire l'iniezione SQL con dati di input

Un plug-in dovrebbe disinfettare tutti gli input dell'utente recuperati direttamente o indirettamente (ad es. Tramite $_POSTo$_GET ) prima di utilizzare i valori di input per interrogare il database MySQL.

Vedi: Formattazione delle istruzioni SQL .


5
È inoltre necessario disinfettare i dati che escono dal database. Fondamentalmente, non fidarti mai dei dati che non sono codificati. codex.wordpress.org/Data_Validation è anche un buon riferimento.
Ian Dunn,

31

Prefisso tutti gli elementi dello spazio dei nomi globale

Un plugin dovrebbe anteporre correttamente TUTTI gli elementi globali dello spazio dei nomi (costanti, funzioni, classi, variabili, anche cose come tassonomie personalizzate, tipi di posta, widget, ecc.). Ad esempio, non creare una funzione chiamata init(); invece, chiamalo qualcosa di simile jpb_init().

Il suo comune dovrebbe usare un prefisso di tre o quattro lettere prima dei nomi o per utilizzare la funzione dello spazio dei nomi PHP . Confronto: prefisso a lettera singola per costanti della classe PHP?

Relazionato


31

Utilizzare un codice PHP5 orientato alla classe e agli oggetti

Non c'è motivo di non scrivere codice PHP5 pulito e orientato agli oggetti. Il supporto di PHP4 verrà eliminato dopo la prossima versione (WP 3.1). Ovviamente, puoi aggiungere il prefisso a tutti i nomi delle tue funzioni per finire con infinitamente_long_function_names_with_lots_of_underscores, ma è molto più semplice scrivere una semplice classe e raggruppare tutto in essa. Inoltre, inserisci la tua classe in un file separato e denominalo di conseguenza in modo da poterlo estendere e mantenere facilmente:

// in functions.php
require 'inc/class-my-cool-plugin.php';
new MyCoolPlugin();

// in inc/class-my-cool-plugin.php
class MyCoolPlugin {
    function __construct() {
        // add filter hooks, wp_enqueue_script, etc.

        // To assign a method from your class to a WP 
        // function do something like this
        add_action('admin_menu', array($this, "admin"));
    }

    public function admin() {
        // public methods, for use outside of the class
        // Note that methods used in other WP functions 
        // (such as add_action) should be public
    }

    private function somethingelse() {
        // methods you only use inside this class
    }
}

non usare il nuovo MyCoolPlugin (); penso che sia meglio agganciare WP tramite Hook: plugins_loaded
bueltge

Non ne sono sicuro. Secondo il codice plugins_loaded è una delle primissime cose caricate, quindi penso che faccia poca differenza o fare un costrutto come questo o aggiungerlo come azione.
Husky,

5
è solo una di quelle migliori pratiche che la rendono più gradevole per tutti.
Arlen Beiler,

1
Per quanto posso vedere l'aggiunta di un hook in plugins_loaded apporta zero miglioramenti e non sarebbe una buona pratica poiché non ci sono miglioramenti, se c'è qualcosa aumenta l'uso della memoria, diminuisce la velocità in quanto deve passare attraverso un'azione invece delle azioni appena aggiunte. Anche l'uso di OO non dovrebbe essere considerato una buona pratica.
Backie,

4
@IanDunn: se vuoi il supporto PHP4, ma il supporto PHP4 è stato abbandonato dal 2008, oltre 4 anni fa. Non c'è motivo di utilizzare ancora i controlli specifici di PHP4.
Husky,


23

Includi solo i file che ti servono ...

Se sei nel front-end, non includere il codice relativo all'area di amministrazione.


21

Annunciare la perdita di dati durante la disinstallazione del plug-in

Al momento della disinstallazione, un plug-in dovrebbe richiedere all'utente che cancellerà i suoi dati e ricevere una conferma che l'utente è d'accordo con l'eliminazione dei dati prima di farlo e un plug-in dovrebbe anche consentire all'utente di conservare i dati al momento della disinstallazione. (Questa idea di @EAMann.)

Relazionato


3
Wordpress stesso visualizza un messaggio di avviso nell'amministratore, che ciò accade (almeno nel trunk in questo momento).
Hacre,

A parte il messaggio di avviso visualizzato da WordPress, è impossibile per il plug-in richiedere all'utente, poiché al momento della disinstallazione è già disattivato. Ma vedi il biglietto # 20578 .
JD

19

Consenti di modificare il nome della cartella del plug-in

/ plugins / pluginName / {} varie

Il "pluginname" utilizzato per la cartella deve essere sempre modificabile.

Questo viene normalmente gestito definendo le costanti e usandole in modo coerente in tutto il plugin.

Inutile dire che molti plugin popolari sono peccatori.

Relazionato:

  • plugins_url() per un facile collegamento alle risorse, incluso con il plugin.

Rinominare la cartella del plugin causerà l'interruzione degli aggiornamenti automatici, quindi non sono sicuro che sia la cosa migliore da fare.
mtekk,

Dovresti riattivare il plug-in dopo aver comunque apportato la modifica (la modifica del nome probabilmente comporterebbe la disattivazione del plug-in), a quel punto WP ricreare o aggiornare le voci DB appropriate relative ai plug-in (quindi non interrompere gli aggiornamenti a tutti).
t31os,

Invece di usare una costante, usa plugin_basename(__FILE__)per capire il nome locale del plugin. Ciò è utile per avere copie dello stesso plugin (test, account multipli altrove ma solo uno per plugin, ...).
Raffaello

19

Usa WordPress (integrato) Gestione degli errori

Non solo return;se alcuni input dell'utente erano sbagliati. Fornire loro alcune informazioni su è stato fatto male.

function some_example_fn( $args = array() ) 
{
    // If value was not set, build an error message
    if ( ! isset( $args['some_value'] ) )
        $error = new WP_Error( 'some_value', sprintf( __( 'You have forgotten to specify the %1$s for your function. %2$s Error triggered inside %3$s on line %4$s.', TEXTDOMAIN ), '$args[\'some_value\']', "\n", __FILE__, __LINE__ ) );

    // die & print error message & code - for admins only!
    if ( isset( $error ) && is_wp_error( $error ) && current_user_can( 'manage_options' ) ) 
        wp_die( $error->get_error_code(), 'Theme Error: Missing Argument' );

    // Elseif no error was triggered continue...
}

Un errore (oggetto) per tutti

È possibile impostare un oggetto di errore globale per il tema o il plugin durante l'avvio:

function bootstrap_the_theme()
{
    global $prefix_error, $prefix_theme_name;
    // Take the theme name as error ID:
    $theme_data = wp_get_theme();
    $prefix_theme_name = $theme_data->Name;
    $prefix_error = new WP_Error( $theme_data->Name );

    include // whatever, etc...
}
add_action( 'after_setup_theme', 'bootstrap_the_theme' );

Successivamente è possibile aggiungere errori illimitati su richiesta:

function some_theme_fn( $args )
{
    global $prefix_error, $prefix_theme_name;
    $theme_data = wp_get_theme();
    if ( ! $args['whatever'] && current_user_can( 'manage_options' ) ) // some required value not set
        $prefix_error->add( $prefix_theme_name, sprintf( 'The function %1$s needs the argument %2$s set.', __FUNCTION__, '$args[\'whatever\']' ) );

    // continue function...
}

Quindi puoi recuperarli tutti alla fine del tuo tema. In questo modo non interrompi il rendering della pagina e puoi comunque generare tutti i tuoi errori per lo sviluppo

function dump_theme_errors()
{
    global $prefix_error, $prefix_theme_name;

    // Not an admin? OR: No error(s)?
    if ( ! current_user_can( 'manage_options' ) ! is_wp_error( $prefix_error ) )
        return;

    $theme_errors = $prefix_error->get_error_messages( $prefix_theme_name );
    echo '<h3>Theme Errors</h3>';
    foreach ( $theme_errors as $error )
        echo "{$error}\n";
}
add_action( 'shutdown', 'dump_theme_errors' );

È possibile trovare ulteriori informazioni a questo Q . Un ticket correlato per correggere il "lavorare insieme" di WP_Errore wp_die()è collegato da lì e ne seguirà un altro. Commenti, critiche e simili sono apprezzati.


Perché si crea un'istanza di un oggetto WP_Error se si accede solo alle sue proprietà e non si passa mai l'istanza come oggetto?
ProfK,

@ProfK L'ho rielaborato per essere più breve e il titolo / contenuto per wp_die();era errato (invertito). Informazioni sulla tua Q) Non capisco completamente. Quando si imposta un'istanza della classe WP_Error si ha pieno accesso ai propri dati tramite funzioni come get_error_code();, get_error_message();, get_error_data();e le versioni plurali. Potresti anche istanziarlo una sola volta nel bootstrap del tuo tema o plugin e semplicemente usare $error->add();per riempire altri errori e infine emetterlo nel piè di pagina $error->get_error_messages();per catturarli tutti.
Kaiser,

@ProfK vi posterò i futuri aggiornamenti di questo Q . Attualmente sto ispezionando il comportamento della classe di errori wp e voglio scrivere un ticket su un'API di errore del tema pubblico (bozza già eseguita). Troverai un link ad un altro biglietto che si avvicina WP_Errore si wp_die()avvicina (ha già una patch) in fondo alla Q. Qualsiasi commento, suggerimento, critica e altro è molto apprezzato.
Kaiser,

18

Riduci a icona i nomi aggiunti allo spazio dei nomi globale

Un plug-in dovrebbe ridurne il più possibile l'impatto minimizzando il numero di nomi che aggiunge allo spazio dei nomi globale .

Questo può essere fatto incapsulando le funzioni del plugin in una classe o usando la funzione degli spazi dei nomi PHP . Il prefisso di tutto può aiutare anche ma non è così flessibile.

Accanto a funzioni e classi, un plugin non dovrebbe introdurre variabili globali. L'uso delle classi normalmente li oscura e semplifica la manutenzione dei plugin.

Relazionato


Potete per favore spostare il "non introdurre variabili globali" nella propria risposta? Ciò è collegato separatamente da questa domanda e in realtà una di cui vorrei discutere (sia perché penso che potrei non essere d'accordo sui casi speciali sia perché voglio imparare dalle opinioni degli altri.)
MikeSchinkel,

17

Commenta usando PhpDoc

Le migliori pratiche sono vicine allo stile PhpDoc. Se non usi un IDE come "Eclipse", puoi dare un'occhiata al Manuale di PhpDoc .

Non devi sapere esattamente come funziona. Gli sviluppatori professionisti possono comunque leggere il codice e hanno solo bisogno di questo come riepilogo. I programmatori e gli utenti di Hobby potrebbero apprezzare il modo in cui lo spieghi allo stesso livello di conoscenza.


17

Utilizzare l'API delle impostazioni prima di add_option

Invece di aggiungere opzioni al DB tramite la funzione add_option, dovresti memorizzarle come un array usando l' API Impostazioni che si occupa di tutto per te.

Utilizzare l'API di modifica del tema prima di add_option

L' API delle modifiche è un costrutto piuttosto semplice e un modo sicuro che consente di aggiungere e recuperare opzioni. Tutto viene salvato come valore serializzato nel database. Facile, sicuro e semplice.


1
Inoltre, utilizzare update_optione mai add_option, la funzione di aggiornamento creerà l'opzione quando non esiste .. :)
t31os

3
Non direi mai di usare add_option. C'è un buon caso d'uso per add_optioncui se l'opzione è già impostata, non viene modificata, quindi la utilizzo in attivazione per preservare possibilmente le preferenze dell'utente già esistenti.
ProfK,

1
Un altro caso d'uso add_optionè quando si desidera disabilitare esplicitamente il caricamento automatico. update_optionimporrà il caricamento automatico su true, quindi si desidera disabilitare il caricamento automatico, da utilizzare add_optiondurante la creazione iniziale dell'opzione.
Dave Romsey,

16

Proteggi la privacy degli utenti dei plug-in

(In precedenza: comunicazione API anonima)

Se un plug-in comunica con un sistema o API esterno (ad esempio un servizio Web), dovrebbe farlo in modo anonimo o fornire all'utente un'opzione anonima che assicuri che nessun dato relativo all'utente del plug-in vada a una seconda parte incontrollata.


15

Plugin host su WordPress.org

Utilizzare il repository SVN fornito su WordPress.org per l'hosting di plug-in. Rende l'esperienza utente più semplice da aggiornare e se non hai mai usato SVN prima d'ora, ti fa capire davvero usandolo in un contesto che lo giustifica.


15

Fornire il controllo di accesso utilizzando le autorizzazioni

In molti casi, gli utenti potrebbero non desiderare che tutti abbiano accesso alle aree create dal plug-in, in particolare con plug-in che eseguono più operazioni complesse, un singolo controllo della capacità codificato potrebbe non essere sufficiente.

Per lo meno, disponi di adeguati controlli di capacità per tutti i diversi tipi di procedure per cui il tuo plugin può essere utilizzato.


12

Importa / esporta impostazioni plugin

Non è così comune tra i plugin, ma se il tuo plugin ha (alcune) impostazioni, dovrebbe fornire l'importazione / esportazione di dati come la configurazione e l'input dell'utente .

L'importazione / esportazione migliora l'usabilità di un plugin.

Un plug-in di esempio che ha una tale funzionalità di importazione ed esportazione (e anche un meccanismo di annullamento) è Breadcrumb NavXT (Wordpress Plugin) (divulgazione completa: un po 'di codice da parte mia, la maggior parte è stata fatta da mtekk).

Relazionato


12

Organizza il tuo codice

È sempre difficile leggere il codice che non è scritto nell'ordine in cui viene eseguito. Prima includi / richiedi, definisci, wp_enqueue_style & _script, ecc., Quindi le funzioni di cui ha bisogno il plugin / tema e infine il builder (es. Schermata di amministrazione, elementi che si integrano nel tema, ecc.).

Prova a separare cose come css e js nelle loro cartelle. Prova anche a farlo con funzioni che sono solo aiutanti, come gli spianatori di array e simili. Mantenere il file "principale" il più pulito e di facile lettura è un modo che aiuta gli utenti, gli sviluppatori e te, quando si tenta di aggiornare in un anno e non si vede il codice da più tempo.

È anche bello avere una struttura che ripeti spesso, in modo da trovare sempre la tua strada. Sviluppare in una struttura nota su diversi progetti ti darà il tempo di renderlo migliore e anche se il tuo client passa a un altro sviluppatore, non sentirai mai "ha lasciato il caos". Questo costruisce la tua reputazione e dovrebbe essere un obiettivo a lungo termine.


Temo che questo sia un po 'troppo sullo stile su cui la gente dovrebbe discutere e non sulle migliori pratiche oggettive con cui tutte le persone rispettate sarebbero d'accordo. È molto importante che ci rivolgiamo solo alle migliori pratiche oggettive in modo che le persone saranno disposte a concordare di "benedire" la lista invece di avere elementi controversi, non importa quanto ben intenzionati.
MikeSchinkel,

11

Muori con stile

morire in modo decente Tutte le funzioni di un plug-in (e persino di temi) dovrebbero essere utilizzate wp_die()in luoghi critici per offrire all'utente alcune informazioni su ciò che è accaduto. Gli errori di php sono fastidiosi e wp_diepossono dare all'utente un messaggio in stile su ciò che il plugin (o loro) ha fatto di sbagliato. Inoltre, se l'utente ha disattivato il debug, il plug-in si interromperà.

L'utilizzo wp_die()aiuta anche a rendere i tuoi plugin / temi compatibili con testpress di wordpress .

Relazionato:

11

Fornire schermate di aiuto per gli utenti

È più bello dire RTFM (fare clic sulla guida) come risposta piuttosto che dover rispondere più volte alla domanda.

/**
  * Add contextual help for this screen
  * 
  * @param $rtfm
  * @uses get_current_screen
  */ 
  function ContextualHelp( /*string*/ $rtfm) 
  { 
     $current_screen = get_current_screen();
     if ($current_screen->id == $this->_pageid) 
     {
        $rtfm .= '<h3>The WordPress Plugin - Screen A</h3>';
        $rtfm .= '<p>Here are some tips: donate to me ' .
     }
     return $rtfm; 
  }
add_action('contextual_help', array($this,'ContextualHelp'),1,1);

update / note: (vedi commenti da kaiser): l'esempio sopra deve essere usato in una classe


Dovrebbe essere nella casella degli strumenti di tutti (purché sia ​​necessario spiegare una schermata dell'interfaccia utente di amministrazione specifica). +1
kaiser,

Btw: dovresti menzionare che questo è pensato per risiedere in una classe e come interagire con $ this -> _ page_id e come sarebbe se tu aggiungessi l'hook dell'azione da un function.php o un file plugin senza una classe .
Kaiser,


9

include la funzione sempre tramite Hook, non direttamente.

Esempio:

  • Non utilizzare per includere la classe del plugin tramite new senza hook

  • Utilizzare Hook plugins_loaded

    // add the class to WP                                   
    function my_plugin_start() {                                                               
        new my_plugin();   
    }                                                        
    add_action( 'plugins_loaded', 'my_plugin_start' );

Aggiornamento: un piccolo esempio dal vivo: Plugin-svn-trunk-page e uno pseudo esempio

//avoid direct calls to this file where wp core files not present
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() {
        }

    } // end class

    function plugin_start() {

        new plugin_class();
    }

    add_action( 'plugins_loaded', 'plugin_start' );
} // end class_exists

Puoi anche caricare tramite mu_plugins_loaded su installazione su più siti, vedi il codice per riferimento all'azione: http://codex.wordpress.org/Plugin_API/Action_Reference Anche qui vedi come includere wP con questo hook: http: // adambrown. info / p / wp_hooks / hook / plugins_loaded? versione = 2.1 & file = wp-settings.php Lo uso molto spesso e non è così difficile e precoce, meglio di una nuova classe difficile ();


@bueltige --- potresti spiegarlo un po 'di più
NetConstructor.com,

3
un piccolo esempio dal vivo: [Plugin-svn-trunk-page] svn.wp-plugins.org/filter-rewrite-rules/trunk/… e uno pseudo esempio //avoid direct calls to this file where wp core files not present 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() { } } // end class function plugin_start() { new plugin_class(); } add_action( 'plugins_loaded', 'plugin_start' ); } // end class_exists
bueltge

2
@ Netconstructor.co - ho aggiornato il thread, il commento è brutto per il codice
bueltge

8

Plugin di licenza con licenza compatibile GPL

I plug-in e i temi devono essere concessi in licenza con una licenza compatibile con WordPress. Ciò consente loro di essere ridistribuiti con WordPress come "programma". Una licenza consigliata è la GPL . Assicurarsi che tutte le librerie di codici incluse con il plug-in siano compatibili con la stessa licenza.

(Questo è stato un problema e un serio punto di discussione sia nel passato che nel presente .)


Lasciamo questo con la compatibilità GPL per il momento: core.trac.wordpress.org/ticket/14685
hakre

8

La descrizione del tuo plugin dovrebbe dettagliare con precisione le funzioni del tuo plugin. Ci sono 10 plugin post in primo piano. Tutti mostrano post in primo piano, ma molti hanno funzionalità diverse. Dovrebbe essere facile confrontare il tuo plugin con plugin simili leggendo la descrizione.

Dovresti evitare di vantarti di quanto sia semplice il tuo plugin a meno che non sia davvero molto semplice. È necessario includere collegamenti utili nella descrizione come il collegamento alle impostazioni.


7

Ridurre al minimo gli effetti collaterali di origini dati remote e servizi web

Un plug-in dovrebbe cache / Shield Webservice e / o XMLRPC / SOAP richieste attraverso un livello di cache / provider di dati se li usi in modo da non effettuare richieste frontali in attesa di una risposta (lenta) del servizio web.

Ciò include il download del feed RSS e di altre pagine. Progetta i tuoi plug-in in modo che richiedano dati in background.

Un possibile STEP è (prendi la pubblicazione su ping.fm come esempio): crea una tabella buffer, diciamo: ping_fm_buffer_post (data, ora, messaggio, submit_time, status)

  1. Per ogni volta che desideri inviare un aggiornamento a ping.fm, aggiungilo a questa tabella.
  2. Ora, dobbiamo creare un plug-in per gestire questi dati. Questo plugin verrà eseguito tramite crontab per verificare la presenza di aggiornamenti non ancora inviati
  3. Poiché disponiamo di questa tabella, possiamo anche elencare tutti i messaggi inviati a Ping.fm e controllare lo stato di ogni post. Nel caso in cui ci sia un problema da parte di Ping.fm, possiamo inviarlo nuovamente.

Non capisco davvero dove sei esattamente diretto con questo. Potete fornire alcuni link al materiale di supporto?
MikeSchinkel,

Inoltre, non sono esattamente sicuro di cosa sia "Net Overhead" . Non c'è un termine migliore? Se è più chiaro, sarà una regola oggettiva migliore. E prevenire " è impossibile; " Riduci a icona " invece?
MikeSchinkel,

Probabilmente hai ragione. Formulazione e prevenzione errate non sono mai possibili, ridurre al minimo gli adattamenti migliori.
Hacre,

7

Prova il tuo plugin

Dovremmo avere definitivamente alcuni strumenti di test nel nostro ambiente di sviluppo plugin.

Sulla base di questa risposta di Ethan Seifert a una domanda di test, queste sono buone pratiche da seguire:

  • Il tuo test unitario dovrebbe testare la minima quantità di comportamento che una classe può eseguire.
  • Quando arrivi al livello di test funzionali, è qui che puoi testare il tuo codice con le dipendenze di Wordpress.
  • A seconda di ciò che fa il tuo plugin - considera l'utilizzo di test basati sul selenio che verificano la presenza di dati nel DOM usando gli ID

Mentre i test sono importanti, dire che i test unitari dovrebbero testare il più piccolo anziché il più grande sembra poco saggio. Se hai difficoltà a testare i problemi dipendenti da WordPress, tuffati nel core di WordPress, troverai un sacco di variabili globali interne che puoi usare per vedere se gli oggetti hanno funzionato.
Backie,

1
Ma coprire il primo più piccolo è di base, in modo da poter raggiungere i test funzionali con WordPress come dice la risposta, non è vero?
Fernando Briano,

1
Questo plugin non è un'applicazione, puoi testare un'applicazione Java senza Java Runtime? Sì, scrivendo Java come modello e quindi testando il plug-in. È probabile che i bug siano nel tuo mockup. *) dichiarazione di non responsabilità o compilazione in codice nativo.
Edelwater,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.