Migliori Pratiche Oggettive per lo Sviluppo di Plugin?
Inizio una wiki della community per raccogliere le migliori pratiche oggettive per lo sviluppo di plugin. Questa domanda è stata ispirata dai commenti di @EAMann su wp-hackers.
L'idea è collaborare per definire quali potrebbero essere le migliori pratiche oggettive, in modo da poterle eventualmente utilizzare in un futuro processo di revisione collaborativa della community.
AGGIORNAMENTO: Dopo le prime risposte è chiaro che dobbiamo avere un solo suggerimento/migliore-pratica per ogni risposta e che le persone dovrebbero verificare l'elenco per evitare duplicati prima di pubblicare.

Utilizza Azioni e Filtri
Se pensi che gli utenti potrebbero voler aggiungere o modificare alcuni dati: fornisci apply_filters() prima di restituire.
P.S. Una cosa che trovo un po' deludente e che la tua domanda affronta è 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 molto di nicchia.
Forse le cose sarebbero diverse se WordPress avesse la possibilità di installare automaticamente i plugin da cui altri plugin dipendono? Così com'è, devo spesso scrivere da zero gran parte delle funzionalità di cui ho bisogno perché i clienti vogliono le cose in un certo modo e i plugin disponibili, pur essendo al 90% quello che serve, non mi permettono la flessibilità di aggiornare il restante 10%.
Mi piacerebbe davvero che coloro che guidano la comunità WordPress identificassero un modo per assicurarsi che i plugin vengano premiati per seguire le migliori pratiche (come aggiungere hook per altri sviluppatori) proprio come le buone risposte vengono premiate su un sito StackExchange.
Facciamo un esempio da un'altra domanda:
Esempio: Voglio fare qualcosa nel mio plugin quando qualcuno ritwitta un articolo. Se ci fosse un hook personalizzato nel plugin di retweet più popolare a cui potermi agganciare e far partire la mia azione, sarebbe fantastico. Ma non c'è, quindi posso modificare il loro plugin per includerlo, ma questo funziona solo per la mia copia, e non voglio provare a ridistribuirla.
Correlati

Caricare Scripts/CSS con wp_enqueue_script
e wp_enqueue_style
I plugin non dovrebbero caricare/tentare di caricare versioni duplicate di file JS/CSS, specialmente jQuery e altri file JS inclusi nel Core di WordPress.
I plugin dovrebbero sempre utilizzare wp_enqueue_script
e wp_enqueue_style
quando collegano file JS e CSS e mai direttamente tramite tag <script>
.
Correlati

Suggerimento: Potrebbe valere la pena inserire una piccola nota sull'uso delle dipendenze (dal momento che fa parte del sistema di enqueue).

Esatto, ma è ancora meglio registrare prima gli stili e gli script e poi richiamarli tramite ID. Questo approccio è molto utile per altri sviluppatori che vogliono modificare gli script o usarli in plugin personalizzati. Inoltre rende più semplice cambiare l'ordine o creare un file riassuntivo.

Inoltre, carica script e stili solo nelle pagine dove sono necessari. http://scribu.net/wordpress/optimal-script-loading.html

Supporto I18n
Tutte le stringhe di output dovrebbero essere collegate a un dominio di testo appropriato per consentire l'internazionalizzazione da parte di parti interessate, anche se lo sviluppatore non è interessato a tradurre il proprio plugin.
Nota che è molto importante caricare i file di lingua durante l'azione init
in modo che l'utente possa agganciarsi all'azione.
Consulta il Codex: I18n per sviluppatori WordPress
E anche questo articolo: Caricare correttamente i file di lingua di WP.
Da WordPress 4.6+
WP 4.6 ha modificato l'ordine di caricamento e le posizioni verificate, rendendolo molto più semplice per sviluppatori e utenti.
Considerando un plugin con un dominio di testo 'my-plugin', WordPress ora cercherà PRIMA un file di traduzione in:
/wp-content/languages/plugins/my-plugin-en_US.mo
Se non lo trova, cercherà dove il plugin gli indica di cercare (di solito nella cartella 'language' del plugin se si segue il codex):
/wp-content/plugins/my-plugin/languages/my-plugin-en_US.mo
Infine, se non viene trovato alcun file di lingua, controllerà 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 luogo definito per aggiungere un file di lingua, poiché prima avrebbero bisogno di sapere dove lo sviluppatore aveva aggiunto il file di lingua, ora l'utente ha solo bisogno di conoscere il dominio di testo del plugin: /wp-content/languages/plugins/TEXTDOMAIN-LOCAL.mo
Di seguito il vecchio metodo (Non rilevante da WP 4.6+)
[...]
Infine, vorrei sottolineare che è importante caricare i file di lingua personalizzati dell'utente da WP_LANG_DIR prima di caricare i file di lingua forniti con il plugin. 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 come fallback per le stringhe non tradotte dall'utente.
public function load_plugin_textdomain()
{
$domain = 'my-plugin';
// Il filtro "plugin_locale" è utilizzato anche 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 è la cosa più importante. Non richiede molto lavoro extra, ma è una delle cose che puoi fare per rendere il tuo plugin più utile per milioni di utenti che non hanno l'inglese come prima lingua. Non devi nemmeno tradurre nulla tu stesso, ma preparare tutto per essere tradotto.

Assicurati che i Plugin non Generino Errori con WP_DEBUG
Testa sempre i tuoi plugin con WP_DEBUG
attivato e idealmente tienilo attivo durante tutto il processo di sviluppo. Un plugin non dovrebbe generare NESSUN errore con WP_DEBUG
attivo. Questo include notifiche di funzioni deprecate e indici non controllati.
Per attivare il debug, modifica il tuo file wp-config.php
impostando la costante WP_DEBUG
su true
. Consulta la Codex sul Debug per maggiori dettagli.

Per favore vedi l'AGGIORNAMENTO riguardante l'avere solo una best practice per risposta; puoi dividerle in più risposte?

Grazie, e non è stata una tua svista, è stata la mia. Ho rivisto la domanda per chiedere una best practice per risposta basandomi sulla domanda di @hakre sui duplicati e su come far funzionare la cosa.

Utilizza Prima le Funzioni Esistenti nel Core di WordPress
Se possibile: usa le funzioni già incluse nel core di WordPress invece di scriverne di nuove. Sviluppa funzioni PHP personalizzate solo quando non esiste una funzione appropriata già presente nel core di WordPress.
Un vantaggio è che puoi usare le "notifiche di deprecazione" per monitorare facilmente le funzioni che dovrebbero essere sostituite. Un altro vantaggio è che gli utenti possono consultare la documentazione della funzione nel Codex e capire meglio cosa fa il plugin, anche se non sono sviluppatori PHP esperti.
Correlati

Uno dei problemi più grandi è scoprire che esiste già una funzione appropriata. Sarebbe utile avere un posto dove pubblicare codice e/o esigenze funzionali per permettere alla community di commentare su quale funzione utilizzare al meglio. Forse StackExchange potrebbe essere usato per questo?

Uff. Sarebbe piuttosto difficile e immagino una sorta di compito infinito. Penso che estendere il codex in questo modo sarebbe la soluzione migliore, poiché esiste già.

Immagino che estendere il codex e magari collegare da lì a thread correlati su StackExchange sarebbe più che sufficiente.

Il problema è che gran parte del core non è progettato strutturalmente per essere riutilizzabile. Ho dovuto copiare e modificare leggermente metà delle funzioni di manipolazione immagini/metadati solo per creare un mio post-type che si comportasse come un allegato, semplicemente perché una funzione come downsize() richiama altre funzioni che includono un controllo hardcoded per post-type='attachment'. Ci sono molti esempi simili, come wp_count_posts() che è un altro caso di mancanza di flessibilità. Prima che si possa davvero riutilizzare il core di WP, sarebbe necessaria una completa rifattorizzazione.

La disinstallazione dovrebbe rimuovere tutti i dati di un plugin
Quando viene rimosso da un'installazione WordPress, un plugin dovrebbe eliminare tutti i file, cartelle, voci del database e tabelle che ha creato, così come i valori delle opzioni che ha generato.
I plugin possono offrire un'opzione per esportare/importare le impostazioni, in modo che queste possano essere salvate al di fuori di WordPress prima della cancellazione.
Correlati

Questo dovrebbe essere il comportamento predefinito, sì, ma dovrebbe anche chiedere all'utente se desidera mantenere alcuni dati... come quando la disinstallazione di un videogioco chiede se si vogliono rimuovere i salvataggi e il materiale scaricato. Un utente potrebbe disattivare il plugin solo per scopi di test e non vorrebbe dover riconfigurare tutte le opzioni quando lo riattiva.

Sto parlando solo quando un plugin viene completamente rimosso, non quando viene disattivato.

Lo capisco... ma a volte elimino i plugin per poterli riaggiungere manualmente da un backup o da una versione beta che non è ancora ospitata nel repository...

@EAMann: Per questo e per migrare i plugin su un altro server, un plugin dovrebbe fornire un meccanismo per esportare e importare le impostazioni.

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

Questo aspetto viene così spesso trascurato. Solo ieri ho trovato impostazioni e intere tabelle che gonfiavano il mio database. È davvero fastidioso!

Non sono completamente sicuro di essere d'accordo. Se il plugin crea le proprie tabelle del database, sì, ma con i nuovi custom post type utilizzati per tutto, presto (si spera) avremo plugin che condividono post type e così via. Questo può rendere l'argomento della "rimozione dei dati" piuttosto complicato.

Ho visto alcuni plugin offrire un pulsante "Disinstalla" nelle loro impostazioni con grandi avvisi in rosso che cancellerà tutti i dati. Questo è separato dalla disattivazione e penso sia un ottimo modo per gestire la situazione. Non tutti usano il pulsante "Elimina" per rimuovere un plugin.

Quindi qual è la migliore pratica quando un plugin crea un custom post type e inserisce dati in quel post type? Quei dati dovrebbero essere eliminati o no? Se no, ci sono plugin che possiamo usare come guida per implementare lo stesso pulsante 'uninstall'?

Prevenire SQL Injection con i Dati di Input
Un plugin dovrebbe sanificare tutti gli input utente ottenuti direttamente o indirettamente (ad esempio tramite $_POST
o $_GET
) prima di utilizzare i valori di input per interrogare il database MySQL.

Dovresti anche sanificare i dati che escono dal database. In sostanza, non fidarti mai di alcun dato che non sia hardcoded. http://codex.wordpress.org/Data_Validation è un buon riferimento.

Utilizza una classe e codice PHP orientato agli oggetti
Non c'è alcun motivo per non scrivere codice PHP pulito e orientato agli oggetti. PHP4 non è più supportato dal 2008. Certo, potresti prefissare tutti i nomi delle tue funzioni per ottenere nomi_di_funzioni_lunghissimi_con_molti_underscore
, ma è molto più semplice scrivere una semplice classe e raggruppare tutto al suo interno. Inoltre, inserisci la tua classe in un file separato e denominarlo in modo appropriato per 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() {
// aggiungi hook dei filtri, wp_enqueue_script, ecc.
// Per assegnare un metodo dalla tua classe a una funzione
// di WP, fai qualcosa come questo
add_action('admin_menu', [$this, "admin"]);
}
public function admin() {
// metodi pubblici, per l'uso al di fuori della classe
// Nota che i metodi utilizzati in altre funzioni di WP
// (come add_action) dovrebbero essere pubblici
}
private function somethingelse() {
// metodi che usi solo all'interno di questa classe
}
}

non usare new MyCoolPlugin(); penso sia meglio agganciarsi a WP tramite l'Hook: plugins_loaded

Non sono sicuro di questo. Secondo il codex, plugins_loaded è una delle prime cose caricate, quindi penso che faccia poca differenza fare un costrutto come questo o aggiungerlo come azione.

è solo una di quelle best practice che rendono tutto più pulito per tutti.

Per quanto posso vedere, aggiungere un hook a plugins_loaded non porta alcun miglioramento e non sarebbe una best practice visto che non ci sono vantaggi, semmai c'è un aumento dell'uso di memoria e una diminuzione della velocità poiché deve passare attraverso un'azione invece di aggiungere direttamente le azioni. Inoltre, l'uso della programmazione orientata agli oggetti non dovrebbe essere considerato una best practice.

C'è un accordo su come creare l'oggetto, dovrebbe essere tramite hook o no?

Questa è un'ottima idea, ma bisogna fare attenzione a includere il file della classe solo se il server utilizza PHP5. Vedi https://github.com/iandunn/WordPress-Plugin-Skeleton/blob/master/bootstrap.php per un esempio.

Prefissa tutti gli elementi nello spazio globale dei nomi
Un plugin dovrebbe prefissare correttamente TUTTI gli elementi nello spazio globale dei nomi (costanti, funzioni, classi, variabili, e anche elementi come tassonomie personalizzate, tipi di post, widget, ecc.). Ad esempio, non creare una funzione chiamata init()
; invece, chiamala qualcosa come jpb_init()
.
È comune utilizzare un prefisso di tre o quattro lettere davanti ai nomi o fare uso della funzionalità Namespace di PHP. Confronta: Prefisso a singola lettera per le costanti di classe PHP?
Correlati

La disattivazione non dovrebbe causare la perdita di dati
Un plugin non dovrebbe eliminare alcun dato in seguito alla disattivazione.
Correlati

Comunicare la Perdita di Dati durante la Disinstallazione del Plugin
Durante la disinstallazione, un plugin dovrebbe avvisare l'utente che eliminerà i suoi dati e ricevere una conferma che l'utente accetti l'eliminazione dei dati prima di procedere. Inoltre, un plugin dovrebbe offrire all'utente la possibilità di conservare i dati durante la disinstallazione. (Questa idea proviene da @EAMann.)
Correlati

WordPress stesso mostra un messaggio di avviso nell'area amministrativa, che questo accade (almeno nella versione trunk al momento).

Oltre al messaggio di avviso visualizzato da WordPress, è impossibile per il plugin chiedere conferma all'utente, poiché al momento della disinstallazione è già disattivato. Ma vedi ticket #20578.

Consenti la modifica del nome della cartella del plugin
/plugins/nomeplugin/{vari}
Il "nomeplugin" utilizzato per la cartella dovrebbe sempre poter essere modificato.
Questo viene normalmente gestito definendo delle costanti e utilizzandole in modo coerente in tutto il plugin.
Inutile dire che molti plugin popolari peccano in questo.
Correlati:
plugins_url()
per collegare facilmente alle risorse incluse nel plugin.

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

Dovresti comunque riattivare il plugin dopo aver apportato la modifica (il cambio di nome probabilmente comporterà la disattivazione del plugin), a quel punto WP ricreerà o aggiornerà le voci del database relative ai plugin (quindi non interromperebbe affatto gli aggiornamenti).

Minimizzare i Nomi Aggiunti allo Spazio dei Nomi Globale
Un plugin dovrebbe ridurre il proprio impatto il più possibile 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 utilizzando la funzionalità degli spazi dei nomi di PHP. Anche prefissare tutto può aiutare, ma non è così flessibile.
Oltre alle funzioni e alle classi, un plugin non dovrebbe introdurre variabili globali. L'uso delle classi normalmente le rende obsolete e semplifica la manutenzione del plugin.
Correlati

Puoi spostare "non dovrebbe introdurre variabili globali" nella sua risposta separata? È correlato ma distinto da questa domanda e in realtà è un punto che vorrei discutere (sia perché penso di poter dissentire in casi speciali, sia perché voglio apprendere dalle opinioni degli altri.)

Utilizza la gestione degli errori integrata in WordPress
Non limitarti a fare un semplice return;
se qualche input dell'utente è sbagliato. Fornisci loro alcune informazioni su cosa è stato fatto male.
function some_example_fn( $args = array() )
{
// Se il valore non è stato impostato, costruisci un messaggio di errore
if ( ! isset( $args['some_value'] ) )
$error = new WP_Error( 'some_value', sprintf( __( 'Hai dimenticato di specificare %1$s per la tua funzione. %2$s Errore attivato in %3$s alla riga %4$s.', TEXTDOMAIN ), '$args[\'some_value\']', "\n", __FILE__, __LINE__ ) );
// interrompi e stampa il messaggio di errore e il codice - solo per gli amministratori!
if ( isset( $error ) && is_wp_error( $error ) && current_user_can( 'manage_options' ) )
wp_die( $error->get_error_code(), 'Errore del Tema: Argomento Mancante' );
// Altrimenti, se nessun errore è stato attivato, continua...
}
Un unico oggetto errore per tutti
Puoi impostare un oggetto errore globale per il tuo tema o plugin durante il bootstrap:
function bootstrap_the_theme()
{
global $prefix_error, $prefix_theme_name;
// Prendi il nome del tema come ID dell'errore:
$theme_data = wp_get_theme();
$prefix_theme_name = $theme_data->Name;
$prefix_error = new WP_Error( $theme_data->Name );
include // qualsiasi cosa, ecc...
}
add_action( 'after_setup_theme', 'bootstrap_the_theme' );
Successivamente puoi 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' ) ) // qualche valore richiesto non impostato
$prefix_error->add( $prefix_theme_name, sprintf( 'La funzione %1$s richiede l\'argomento %2$s impostato.', __FUNCTION__, '$args[\'whatever\']' ) );
// continua la funzione...
}
Quindi puoi recuperarli tutti alla fine del tuo tema. In questo modo non interrompi il rendering della pagina e puoi comunque mostrare tutti i tuoi errori per lo sviluppo
function dump_theme_errors()
{
global $prefix_error, $prefix_theme_name;
// Non sei un amministratore? OPPURE: Nessun errore?
if ( ! current_user_can( 'manage_options' ) ! is_wp_error( $prefix_error ) )
return;
$theme_errors = $prefix_error->get_error_messages( $prefix_theme_name );
echo '<h3>Errori del Tema</h3>';
foreach ( $theme_errors as $error )
echo "{$error}\n";
}
add_action( 'shutdown', 'dump_theme_errors' );
Puoi trovare ulteriori informazioni su questa domanda. Un ticket correlato per sistemare il "funzionamento insieme" di WP_Error
e wp_die()
è linkato da lì e un altro ticket seguirà. Commenti, critiche e simili sono apprezzati.

Perché istanzi un oggetto WP_Error se accedi solo alle sue proprietà e non passi mai l'istanza come oggetto?

@ProfK L'ho rielaborato per renderlo più breve e il titolo/contenuto per wp_die();
era sbagliato (invertito). Riguardo alla tua domanda) Non la capisco completamente. Quando configuri un'istanza della classe WP_Error hai pieno accesso ai suoi dati tramite funzioni come get_error_code();
, get_error_message();
, get_error_data();
e le versioni plurali. Potresti anche istanziarla una sola volta all'avvio del tuo tema o plugin e semplicemente usare $error->add();
per aggiungere altri errori e infine visualizzarli nel footer con $error->get_error_messages();
per catturarli tutti.

@ProfK Pubblicherò aggiornamenti futuri su questa domanda. Attualmente sto analizzando il comportamento della classe wp error e voglio scrivere un ticket su un'API pubblica per gli errori del tema (bozza già pronta). Troverai un link a un altro ticket che avvicina WP_Error
e wp_die()
(ha già una patch) in fondo alla domanda. Qualsiasi commento, suggerimento, critica e altro è molto apprezzato.

Usa l'API delle Impostazioni prima di add_option
Invece di aggiungere opzioni al database tramite la funzione add_option, dovresti memorizzarle come un array utilizzando l'API delle Impostazioni che si occupa di tutto per te.
Usa l'API delle Modifiche del Tema prima di add_option
L'API delle Modifiche è una struttura piuttosto semplice e un modo sicuro che consente di aggiungere e recuperare opzioni. Tutto viene salvato come valore serializzato nel tuo database. Facile, sicuro e semplice.

Inoltre, usa update_option
e mai add_option
, la funzione update creerà l'opzione quando non esiste.. :)

Non direi mai di usare add_option
. C'è un buon caso d'uso per add_option
dove se l'opzione è già impostata, non viene modificata, quindi la uso nell'attivazione per preservare eventuali preferenze utente già esistenti.

Commentare utilizzando PhpDoc
La migliore pratica è vicina allo stile PhpDoc. Se non utilizzi un IDE come "Eclipse", puoi semplicemente dare un'occhiata al Manuale PhpDoc.
Non è necessario sapere esattamente come funziona. Gli Sviluppatori Professionisti possono comunque leggere il codice e hanno solo bisogno di questo come riepilogo. I programmatori hobbisti e gli utenti potrebbero apprezzare il modo in cui lo spieghi allo stesso livello di conoscenza.

Proteggere la Privacy degli Utenti dei Plugin
(Precedentemente: Comunicazione API Anonima)
Se un plugin comunica con un sistema esterno o un'API (ad esempio un servizio web), dovrebbe farlo in modo anonimo o fornire all'utente un'opzione anonima che garantisca che nessun dato relativo all'utente del plugin venga trasmesso a terze parti in modo incontrollato.

Ospita i Plugin su WordPress.org
Utilizza il repository SVN fornito su WordPress.org per ospitare i plugin. Offre un'esperienza di aggiornamento più semplice agli utenti e, se non hai mai usato SVN prima, ti permette di comprenderlo utilizzandolo in un contesto che giustifica il suo impiego.

Fornire il Controllo degli Accessi Utilizzando i Permessi
In molti casi, gli utenti potrebbero non volere che tutti abbiano accesso alle aree create dal tuo plugin, specialmente con plugin che eseguono operazioni complesse multiple. Un singolo controllo delle capacità hardcoded potrebbe non essere sufficiente.
Come minimo, assicurati di avere controlli appropriati delle capacità per tutti i diversi tipi di procedure per cui il tuo plugin può essere utilizzato.

Organizza il tuo codice
È sempre difficile leggere codice che non è scritto nell'ordine in cui viene eseguito. Prima include/require, define, wp_enqueue_style & _script, ecc., poi le funzioni di cui il plugin/theme ha bisogno e infine il builder (ad esempio schermata di amministrazione, elementi che si integrano nel tema, ecc.).
Cerca di separare elementi come CSS e JS nelle loro cartelle dedicate. Cerca anche di fare lo stesso con funzioni che sono solo helper, come quelle per appiattire array e simili. Mantenere il file "principale" il più pulito e leggibile possibile è un modo per aiutare utenti, sviluppatori e te stesso, quando proverai ad aggiornare tra un anno e non avrai visto il codice per molto tempo.
È anche utile avere una struttura che ripeti spesso, così da ritrovarti sempre. Sviluppare in una struttura conosciuta su diversi progetti ti darà il tempo di migliorarla e anche se il tuo cliente 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 legato allo stile, su cui le persone potrebbero discutere, e non a pratiche migliori oggettive con cui tutti i rispettati esperti sarebbero d'accordo. È molto importante che ci concentriamo solo su pratiche migliori oggettive, in modo che le persone siano disposte a concordare nel "benedire" l'elenco, invece di avere elementi controversi, non importa quanto ben intenzionati.

Importa / Esporta Impostazioni del Plugin
Non è così comune tra i plugin, ma se il tuo plugin ha (alcune) impostazioni, dovrebbe fornire la possibilità di Importare/Esportare dati come configurazione e input utente.
Importa/Esporta migliora l'usabilità di un plugin.
Un esempio di plugin che ha questa funzionalità di importazione ed esportazione (e anche un meccanismo di annullamento) è Breadcrumb NavXT (Plugin WordPress) (piena trasparenza: c'è un po' di mio codice lì dentro, ma la maggior parte è stato fatto da mtekk).
Correlati

Morire con stile
Termina in modo elegante
Tutte le funzioni di un plugin (e anche dei temi) dovrebbero utilizzare wp_die()
nei punti critici per offrire all'utente qualche informazione su ciò che è accaduto. Gli errori PHP sono fastidiosi e wp_die
può fornire all'utente un messaggio ben formattato su cosa il plugin (o loro) ha fatto di sbagliato. Inoltre, se l'utente ha il debug disattivato, il plugin si interromperà semplicemente.
L'uso di wp_die()
aiuta anche a garantire che i tuoi plugin/temi siano compatibili con la suite di test di WordPress.

Fornisci schermate di aiuto per gli utenti
È più gentile rispondere RTFM (clicca su aiuto) piuttosto che dover rispondere alla stessa domanda ripetutamente.
/**
* Aggiungi aiuto contestuale per questa schermata
*
* @param $rtfm
* @uses get_current_screen
*/
function ContextualHelp( /*string*/ $rtfm)
{
$current_screen = get_current_screen();
if ($current_screen->id == $this->_pageid)
{
$rtfm .= '<h3>Plugin WordPress - Schermata A</h3>';
$rtfm .= '<p>Ecco alcuni suggerimenti: dona a me ' .
}
return $rtfm;
}
add_action('contextual_help', array($this,'ContextualHelp'),1,1);
aggiornamento / nota: (vedi commenti di kaiser): l'esempio sopra va usato in una classe

Dovrebbe far parte del toolkit di tutti (finché devi spiegare una specifica schermata dell'interfaccia admin). +1

Offri Form Estensibili
Quando un plugin offre la possibilità di inserire dati, dovrebbe sempre includere un hook alla fine, appena prima del pulsante "invia" e/o "resetta", in modo che gli sviluppatori possano facilmente estendere il form non solo con campi, ma anche con pulsanti aggiuntivi.
Vedi: Settings API
Correlati

Includi sempre le funzioni tramite Hook, non direttamente.
Esempio:
Non utilizzare new per includere la classe del plugin senza hook
Utilizza l'Hook plugins_loaded
// aggiungi la classe a WP function my_plugin_start() { new my_plugin(); } add_action( 'plugins_loaded', 'my_plugin_start' );
Aggiornamento: un piccolo esempio live: Plugin-svn-trunk-page e un esempio pseudo
//evita chiamate dirette a questo file dove i file core di wp non sono presenti
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() {
}
} // fine classe
function plugin_start() {
new plugin_class();
}
add_action( 'plugins_loaded', 'plugin_start' );
} // fine class_exists
Puoi anche caricare via mu_plugins_loaded su installazioni multisite, consulta il codex per i riferimenti alle azioni: http://codex.wordpress.org/Plugin_API/Action_Reference Qui puoi anche vedere come includere WP con questo hook: http://adambrown.info/p/wp_hooks/hook/plugins_loaded?version=2.1&file=wp-settings.php Lo uso molto spesso e non è così difficile e precoce, meglio di un hard new class();

@bueltige --- potresti spiegare questo un po' più in dettaglio

un piccolo esempio live: [Plugin-svn-trunk-page]http://svn.wp-plugins.org/filter-rewrite-rules/trunk/filter-rewrite-rules.php e un esempio pseudo
`//evita chiamate dirette a questo file quando i file core di wp non sono presenti 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() { }
} // fine classe
function plugin_start() {
new plugin_class(); }
add_action( 'plugins_loaded', 'plugin_start' ); } // fine class_exists`

La descrizione del tuo plugin dovrebbe dettagliare accuratamente le funzioni del tuo plugin. Ci sono 10 plugin per i post in evidenza. Tutti mostrano i post in evidenza, 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 veramente molto basilare. Dovresti includere nella descrizione link utili come quello alle impostazioni.

Plugin con Licenza Compatibile con la GPL
I plugin e i temi dovrebbero essere rilasciati con una licenza compatibile con WordPress. Ciò consente la loro ridistribuzione insieme a WordPress come "programma". Una licenza raccomandata è la GPL. Assicurati che tutte le librerie di codice incluse nel plugin siano compatibili con la stessa licenza.
(Questo ha rappresentato un problema ed è stato un serio punto di dibattito sia in passato che nel presente.)

Lasciamo per il momento la questione della compatibilità con la GPL: http://core.trac.wordpress.org/ticket/14685

Minimizzare gli Effetti Collaterali delle Fonti di Dati Remote e dei Webservice
Un Plugin dovrebbe Memorizzare nella Cache/Proteggere i Webservice e/o le richieste XMLRPC/SOAP attraverso un livello di caching/fornitore di dati se li utilizzi, in modo da non far attendere le richieste frontend per una (lenta) risposta del webservice.
Ciò include il download di feed RSS e altre pagine. Progetta i tuoi plugin in modo che richiedano i dati in background.
Un possibile PASSAGGIO è (prendiamo come esempio l'invio a ping.fm): Crea una tabella buffer, ad esempio: ping_fm_buffer_post( date, time, message, submitted_time, status )
- Ogni volta che vuoi inviare un aggiornamento a ping.fm, aggiungilo a questa tabella.
- Ora, dobbiamo creare un plugin per gestire questi dati. Questo plugin verrà eseguito tramite crontab per verificare ogni aggiornamento non ancora inviato
- Poiché abbiamo questa tabella, possiamo anche elencare ogni messaggio inviato a ping.fm e verificare lo stato di ogni post. Nel caso ci siano problemi dal lato di ping.fm, possiamo reinviarlo.

Non capisco esattamente dove vuoi arrivare con questo. Puoi fornire alcuni link a materiale di supporto?

Inoltre, non sono sicuro di cosa sia esattamente "Net Overhead". Non c'è un termine migliore? Se fosse più chiaro sarebbe una regola obiettiva migliore. E "Prevent" è impossibile; "Minimize" invece?

Utilizza gli Standard di Codifica di WordPress
http://codex.wordpress.org/WordPress_Coding_Standards
Sai quanto è più semplice aggiornare un codice su cui hai lavorato rispetto a un codice realizzato da qualcun altro? Gli standard di codifica rendono più facile per qualsiasi sviluppatore che lavora a un progetto comprendere cosa sta succedendo.
Sappiamo che il tuo plugin o tema è tuo, e il modo in cui interrompi le righe e aggiungi le parentesi graffe è un'espressione della tua individualità. Ogni indentazione è un'affermazione ponderata con cura. Ma con il tuo codice personalizzato, stai contribuendo a WordPress, anche se il tuo codice non fa parte dell'applicazione core. Gli standard di codifica aiutano gli sviluppatori a familiarizzare rapidamente con il tuo codice.
