Migliori Pratiche Oggettive per lo Sviluppo di Plugin?

23 ago 2010, 06:53:13
Visualizzazioni: 18K
Voti: 138

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.

3
Commenti

Non capisco davvero come dovrebbe funzionare il wiki della community su questo (e gli altri) con SE correttamente, ma forse è una domanda da fare su meta. Si accumuleranno soprattutto duplicati nelle risposte.

hakre hakre
23 ago 2010 14:57:34

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

MikeSchinkel MikeSchinkel
23 ago 2010 19:21:00

Lettura correlata: I 10 errori più comuni nei plugin Wordpress

Sisir Sisir
4 dic 2013 12:01:48
Tutte le risposte alla domanda 30
0
74

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

23 ago 2010 16:03:04
3
55

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

23 ago 2010 11:56:05
Commenti

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

t31os t31os
17 feb 2011 20:26:09

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.

bueltge bueltge
20 set 2012 00:35:58

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

M-R M-R
12 dic 2012 11:38:41
2
50

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/' 
    );
}
23 ago 2010 19:53:02
Commenti

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.

2ndkauboy 2ndkauboy
29 ago 2010 23:23:17

È una cosa così preziosa e allo stesso tempo semplice da fare, volevo solo dire che sono d'accordo e che ogni autore di plugin dovrebbe farlo.

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

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.

23 ago 2010 16:08:31
Commenti

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

MikeSchinkel MikeSchinkel
23 ago 2010 19:36:25

Certo, nessun problema. Scusa per quello.

John P Bloch John P Bloch
23 ago 2010 20:02:30

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.

MikeSchinkel MikeSchinkel
23 ago 2010 21:32:13

Se potessi votare due volte questa risposta, lo farei. È così frustrante quando lavoro su un sito di sviluppo e devo disattivare WP_DEBUG perché un plugin di cui ho bisogno sta sputando avvisi e notifiche ovunque.

Ian Dunn Ian Dunn
28 ago 2012 19:04:19
5
42

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

24 ago 2010 09:43:32
Commenti

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?

MikeSchinkel MikeSchinkel
25 ago 2010 23:20:29

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

kaiser kaiser
27 ago 2010 09:53:03

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

kaiser kaiser
28 ago 2010 02:49:01

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.

wyrfel wyrfel
16 feb 2011 12:04:23

Concordo pienamente. Il mio esempio preferito in assoluto: wp-login.php. Quindi "Se puoi" era un buon inizio per la risposta...

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

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

23 ago 2010 07:07:13
Commenti

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.

EAMann EAMann
23 ago 2010 17:24:35

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

Travis Northcutt Travis Northcutt
23 ago 2010 19:33:02

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 EAMann
23 ago 2010 21:29:28

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

hakre hakre
24 ago 2010 12:18:11

@hakre - Import/Export: sembra un'altra best practice?

MikeSchinkel MikeSchinkel
26 ago 2010 10:06:17

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

Raphael Raphael
15 nov 2010 13:17:04

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.

wyrfel wyrfel
16 feb 2011 12:23:00

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.

gabrielk gabrielk
21 giu 2011 19:20:43

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

urok93 urok93
13 ago 2012 19:31:45

Devo dissentire su questo. Un pulsante di disinstallazione nel plugin è ottimo, ma semplicemente eliminare il plugin non dovrebbe attivare modifiche al database senza numerosi avvisi.

Ben Miller Ben Miller
17 ago 2013 23:07:10
Mostra i restanti 6 commenti
1
34

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.

Vedi: Formattazione delle istruzioni SQL.

23 ago 2010 19:25:59
Commenti

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.

Ian Dunn Ian Dunn
21 giu 2011 01:57:10
7
31

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
    }
}
1 set 2010 17:58:59
Commenti

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

bueltge bueltge
15 ott 2010 15:54:05

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.

Husky Husky
16 ott 2010 00:07:25

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

Arlen Beiler Arlen Beiler
19 ott 2010 05:01:39

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.

Backie Backie
16 feb 2011 12:46:10

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

urok93 urok93
13 ago 2012 19:32:36

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.

Ian Dunn Ian Dunn
28 ago 2012 19:07:16

@IanDunn: se vuoi il supporto per PHP4, ma il supporto per PHP4 è stato abbandonato dal 2008, oltre 4 anni fa. Non c'è alcuna ragione per continuare a utilizzare controlli specifici per PHP4.

Husky Husky
29 ago 2012 16:42:54
Mostra i restanti 2 commenti
1
31

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

23 ago 2010 20:02:55
Commenti

Userei le funzioni globali con molta parsimonia, anche quando prefissate. Invece, utilizzerei classi con un namespace. Se vuoi avere funzioni di utilità/template, puoi usare una funzione statica all'interno di una classe.

Husky Husky
1 set 2022 13:21:28
0
26

La disattivazione non dovrebbe causare la perdita di dati

Un plugin non dovrebbe eliminare alcun dato in seguito alla disattivazione.

Correlati

23 ago 2010 07:27:17
0
23

Includi solo i file di cui hai bisogno...

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

14 gen 2011 00:05:25
2
21

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

23 ago 2010 19:29:33
Commenti

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

hakre hakre
24 ago 2010 12:06:18

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.

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

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.
24 ott 2010 19:45:38
Commenti

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

mtekk mtekk
14 gen 2011 07:53:29

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

t31os t31os
17 feb 2011 20:34:50

Invece di usare una costante, utilizza plugin_basename(__FILE__) per determinare il nome locale del plugin. Questo è utile anche per avere copie dello stesso plugin (test, più account altrove ma solo uno per plugin, ...).

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

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

23 ago 2010 23:23:13
Commenti

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

MikeSchinkel MikeSchinkel
25 ago 2010 22:57:05
3
19

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.

3 mag 2011 18:07:57
Commenti

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

ProfK ProfK
28 ott 2011 09:03:19

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

kaiser kaiser
28 ott 2011 14:01:24

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

kaiser kaiser
28 ott 2011 21:00:29
3
17

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.

29 ago 2010 17:24:35
Commenti

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

t31os t31os
17 feb 2011 20:32:29

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.

ProfK ProfK
28 ott 2011 08:47:24

Un altro caso d'uso per add_option è quando vuoi disabilitare esplicitamente il caricamento automatico. update_option imporrà autoload a true, quindi se vuoi disabilitare autoload, usa add_option quando crei inizialmente l'opzione.

Dave Romsey Dave Romsey
26 lug 2012 08:24:37
0
17

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.

25 ago 2010 01:21:26
0
16

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.

23 ago 2010 17:39:12
0
15

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.

25 ago 2010 22:15:36
0
15

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.

25 ago 2010 22:41:48
1
12

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.

25 ago 2010 01:32:12
Commenti

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.

MikeSchinkel MikeSchinkel
26 ago 2010 09:55:49
0
12

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

26 ago 2010 11:19:50
0
11

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.

Correlati:
24 ago 2010 09:40:19
2
11

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

18 feb 2011 03:15:10
Commenti

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

kaiser kaiser
18 feb 2011 16:58:50

A proposito: dovresti menzionare che questo è pensato per risiedere in una Classe e come interagire con $this->_page_id e come sarebbe se aggiungessi l'hook action da un functions.php o da un file di plugin senza una Classe.

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

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

24 ago 2010 02:10:57
3

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

15 ott 2010 16:06:02
Commenti

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

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

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`

bueltge bueltge
14 feb 2011 23:11:00

@Netconstructor.co - ho aggiornato il thread, il commento non è adatto per il codice

bueltge bueltge
14 feb 2011 23:14:57
0

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.

30 ago 2010 06:41:47
1

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

23 ago 2010 19:53:21
Commenti

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

hakre hakre
25 ago 2010 23:13:49
3

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 )

  1. Ogni volta che vuoi inviare un aggiornamento a ping.fm, aggiungilo a questa tabella.
  2. Ora, dobbiamo creare un plugin per gestire questi dati. Questo plugin verrà eseguito tramite crontab per verificare ogni aggiornamento non ancora inviato
  3. 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.
23 ago 2010 23:30:13
Commenti

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

MikeSchinkel MikeSchinkel
25 ago 2010 22:39:08

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?

MikeSchinkel MikeSchinkel
25 ago 2010 23:03:00

Hai (probabilmente) ragione. Formulazione sbagliata e "prevent" non è mai possibile, "minimize" si adatta meglio.

hakre hakre
25 ago 2010 23:05:43
0

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.

21 giu 2011 19:40:14