Come rendere estensibile un plugin per WordPress

Pubblicato: 2022-03-10
Riassunto veloce ↬ Proprio quando pensavi di aver finalmente trovato un plugin che fa tutto ciò di cui hai bisogno, c'è ancora quella piccola cosa importante che non può fare. Scopri come rendere estensibile il tuo plugin e ridurre il mal di testa.

Hai mai usato un plugin e avresti voluto che facesse qualcosa di leggermente diverso? Forse avevi bisogno di qualcosa di unico che andasse oltre lo scopo della pagina delle impostazioni del plugin.

L'ho incontrato personalmente e scommetto che lo hai fatto anche tu. Se sei uno sviluppatore di plugin per WordPress, molto probabilmente anche alcuni dei tuoi utenti hanno riscontrato questo problema durante l'utilizzo del tuo plugin.

Ecco uno scenario tipico: hai finalmente trovato quel plugin che fa tutto ciò di cui hai bisogno, tranne una piccola cosa importante. Non ci sono impostazioni o opzioni per abilitare quella piccola cosa, quindi sfogli la documentazione e scopri che non puoi fare nulla al riguardo. Richiedi la funzione nel forum di supporto del plug-in di WordPress, ma senza dadi. Alla fine, lo disinstalli e continui la tua ricerca.

Immagina di essere lo sviluppatore di questo plugin. Cosa faresti se un utente chiedesse alcune funzionalità particolari?

L'ideale sarebbe implementarlo. Ma se la funzione fosse per un caso d'uso molto speciale, aggiungerla non sarebbe pratico. Non sarebbe utile avere un'impostazione del plug-in che solo lo 0,1% dei tuoi utenti potrebbe utilizzare.

Vorresti solo implementare funzionalità che interessano la maggior parte dei tuoi utenti. In realtà, l'80% degli utenti utilizza il 20% delle funzionalità (regola 80/20). Quindi, assicurati che qualsiasi nuova funzionalità sia altamente richiesta e che l'80% dei tuoi utenti ne tragga vantaggio, prima di implementarla. Se hai creato un'impostazione per ogni funzionalità richiesta, il tuo plug-in diventerebbe complicato e gonfio e nessuno lo vuole.

La soluzione migliore è rendere il plug-in estensibile, dal punto di vista del codice, in modo che altre persone possano migliorarlo o modificarlo in base alle proprie esigenze.

In questo articolo imparerai perché rendere estensibile il tuo plugin è una buona idea. Condividerò anche alcuni suggerimenti su come ho imparato a farlo.

Altro dopo il salto! Continua a leggere sotto ↓

Cosa rende estensibile un plugin?

In poche parole, un plug-in estensibile significa che aderisce alla parte "O" dei principi SOLID della programmazione orientata agli oggetti, ovvero il principio di apertura/chiusura.

Se non hai familiarità con il principio di apertura/chiusura, significa sostanzialmente che altre persone non dovrebbero dover modificare il tuo codice per modificare qualcosa .

Applicando questo principio a un plugin di WordPress, significherebbe che un plugin è estensibile se contiene disposizioni che consentono ad altre persone di modificarne il comportamento. È proprio come WordPress consente alle persone di "agganciarsi" a diverse aree di WordPress, ma a livello di plug-in.

Un tipico esempio di plugin

Vediamo come possiamo creare un plugin estensibile, partendo da un plugin di esempio che non lo è.

Supponiamo di avere un plugin che genera un widget della barra laterale che mostra i titoli degli ultimi tre post. Al centro del plug-in c'è una funzione che racchiude semplicemente i titoli di quei tre post nei tag elenco:

 function get_some_post_titles() { $args = array( 'posts_per_page' => 3, ); $posts = get_posts( $args ); $output = '
    '; foreach ( $ post come $ post ) { $output .= '
  • '. $post->post_title . '
  • '; } $output .= '
'; restituisce $output; }

Sebbene questo codice funzioni e svolga il lavoro, non è del tutto estensibile.

Come mai? Poiché la funzione è impostata a modo suo, non è possibile modificarne il comportamento senza modificare direttamente il codice.

E se un utente volesse visualizzare più di tre post, o magari includere link con i titoli dei post? Non c'è modo di farlo con il codice sopra. L'utente è bloccato su come funziona il plug-in e non può nulla per cambiarlo.

Includere cento impostazioni non è la risposta

Esistono diversi modi per migliorare il plug-in sopra per consentire agli utenti di personalizzarlo.

Uno di questi modi sarebbe aggiungere molte opzioni nelle impostazioni, ma anche questo potrebbe non soddisfare tutte le possibilità che gli utenti vorrebbero dal plugin.

E se l'utente volesse eseguire una delle seguenti operazioni (scenari che rivisiteremo in seguito):

  • visualizzare prodotti WooCommerce o post di una particolare categoria;
  • visualizzare gli elementi in un carosello fornito da un altro plugin, invece che come un semplice elenco;
  • eseguire una query del database personalizzata, quindi utilizzare i post di tali query nell'elenco.

Se aggiungessimo un centinaio di impostazioni al nostro widget, saremmo in grado di coprire i casi d'uso sopra. Ma cosa succede se uno di questi scenari cambia e ora l'utente desidera visualizzare solo i prodotti WooCommerce attualmente in stock? Il widget avrebbe bisogno di ancora più impostazioni per adattarsi a questo. Molto presto, avremmo un milione di impostazioni.

Inoltre, un plug-in con un enorme elenco di impostazioni non è esattamente intuitivo. Se possibile, evita questo percorso.

Quindi, come faremmo per risolvere questo problema? Renderemmo il plugin estensibile.

Aggiungere i nostri ganci per renderlo estensibile

Studiando il codice del plugin sopra, vediamo alcune operazioni che la funzione principale esegue:

  • Ottiene i post usando get_posts .
  • Genera un elenco di titoli di post.
  • Restituisce l'elenco generato.

Se altre persone dovessero modificare il comportamento di questo plug-in, il loro lavoro molto probabilmente comporterebbe queste tre operazioni. Per rendere il nostro plugin estensibile, dovremmo aggiungere hook attorno a questi per aprirli ad altri sviluppatori.

In generale, queste sono buone aree per aggiungere hook a un plugin:

  • intorno e all'interno dei principali processi,
  • durante la creazione di output HTML,
  • per modificare le query di post o database,
  • prima di restituire valori da una funzione.

Un tipico esempio di plugin estensibile

Seguendo queste regole pratiche, possiamo aggiungere i seguenti filtri per rendere il nostro plugin estensibile:

  • aggiungi myplugin_get_posts_args per modificare gli argomenti di get_posts ,
  • aggiungi myplugin_get_posts per sovrascrivere i risultati di get_posts ,
  • aggiungi myplugin_list_item per personalizzare la generazione di una voce di elenco,
  • aggiungi myplugin_get_some_post_titles per sovrascrivere l'elenco generato restituito.

Ecco di nuovo il codice con tutti gli hook aggiunti:

 function get_some_post_titles() { $args = array( 'posts_per_page' => 3, ); // Let other people modify the arguments. $posts = get_posts( apply_filters( 'myplugin_get_posts_args', $args ) ); // Let other people modify the post array, which will be used for display. $posts = apply_filters( 'myplugin_get_posts', $posts, $args ); $output = '
    '; foreach ( $ post come $ post ) { // Consenti ad altre persone di modificare la voce dell'elenco. $output .= '
  • '. apply_filters( 'myplugin_list_item', $post->post_title, $post ) . '
  • '; } $output .= '
'; // Consenti ad altre persone di modificare la nostra lista di output. return apply_filters('myplugin_get_some_post_titles', $output, $args); }

Puoi anche ottenere il codice sopra nell'archivio GitHub.

Sto aggiungendo molti hook qui, che potrebbero sembrare poco pratici perché il codice di esempio è abbastanza semplice e piccolo, ma illustra il mio punto: aggiungendo solo quattro hook, altri sviluppatori possono ora personalizzare il comportamento del plug-in in tutti i modi.

Spaziatura dei nomi e contesto per gli hook

Prima di procedere, annota due cose importanti sugli hook che abbiamo implementato:

  • Stiamo assegnando lo spazio dei nomi agli hook con myplugin_ .
    Questo assicura che il nome dell'hook non sia in conflitto con l'hook di qualche altro plugin. Questa è solo una buona pratica, perché se viene chiamato un altro hook con lo stesso nome, potrebbe causare effetti indesiderati.
  • Stiamo anche passando un riferimento a $args in tutti gli hook per il contesto.
    Lo faccio in modo che se altri usano questo filtro per cambiare qualcosa nel flusso del codice, possono usare quel parametro $args come riferimento per avere un'idea del motivo per cui è stato chiamato l'hook, in modo che possano eseguire le loro regolazioni di conseguenza.

Gli effetti dei nostri ganci

Ricordi gli scenari unici di cui ho parlato prima? Rivisitiamoli e vediamo come i nostri ganci li hanno resi possibili:

  • Se l'utente desidera visualizzare prodotti WooCommerce o post di una particolare categoria , può utilizzare il filtro myplugin_get_posts_args per aggiungere i propri argomenti per quando il plug-in interroga i post, oppure può utilizzare myplugin_get_posts per sovrascrivere completamente i post con il proprio elenco.
  • Se l'utente desidera visualizzare gli elementi in un carosello fornito da un altro plug -in, invece che come un semplice elenco, può sovrascrivere l'intero output della funzione con myplugin_get_some_post_titles e invece generare un carosello da lì.
  • Se l'utente desidera eseguire una query del database personalizzata e quindi utilizzare i post di quella query nell'elenco, in modo simile al primo scenario, può utilizzare myplugin_get_posts per utilizzare la propria query del database e modificare l'array dei post.

Molto meglio!

Un rapido esempio di come utilizzare i nostri filtri

Gli sviluppatori possono usare add_filter per agganciarsi ai nostri filtri sopra (o usare add_action per le azioni).

Prendendo il nostro primo scenario sopra, uno sviluppatore può semplicemente fare quanto segue per visualizzare i prodotti WooCommerce usando il filtro myplugin_get_posts_args che abbiamo creato:

 add_filter( 'myplugin_get_posts_args', 'show_only_woocommerce_products' ); function show_only_woocommerce_products( $args ) { $args['post_type'] = 'product'; return $args; }

Possiamo anche usare ganci d'azione

Oltre a usare apply_filters , possiamo anche usare do_action per rendere il nostro codice estensibile. La differenza tra i due è che il primo consente ad altri di modificare una variabile, mentre il secondo consente ad altri di eseguire funzionalità aggiuntive in varie parti del nostro codice.

Quando utilizziamo le azioni, esponiamo essenzialmente il flusso del plug-in ad altri sviluppatori e consentiamo loro di eseguire altre cose in tandem.

Potrebbe non essere utile nel nostro esempio (perché stiamo solo visualizzando uno shortcode), ma sarebbe utile in altri. Ad esempio, dato un plug-in di backup estensibile, potremmo creare un plug-in che carichi anche il file di backup su un servizio di terze parti come Dropbox.

"Grande! Ma perché dovrei preoccuparmi di rendere il mio plug-in estensibile?"

Bene, se non sei ancora convinto dell'idea, ecco alcuni pensieri sul perché consentire ad altre persone di modificare il comportamento del tuo plug-in è una buona idea.

Apre il plug-in a più possibilità di personalizzazione

Ognuno ha esigenze diverse. E c'è una grande possibilità che il tuo plugin non li soddisfi tutti, né puoi anticiparli. L'apertura del plug-in per consentire modifiche alle aree chiave del comportamento del plug-in può fare miracoli.

Consente alle persone di introdurre modifiche senza toccare il codice del plug-in

Gli altri sviluppatori non saranno obbligati a modificare direttamente i file del tuo plugin. Questo è un enorme vantaggio perché la modifica diretta del file di un plug-in è generalmente una cattiva pratica. Se il plug-in viene aggiornato, tutte le modifiche verranno cancellate.

Se aggiungiamo i nostri hook che altre persone possono utilizzare, le modifiche del plug-in possono essere inserite in una posizione esterna, ad esempio in un altro plug-in. In questo modo, il plug-in originale non verrà toccato affatto e può essere aggiornato liberamente senza interrompere nulla e tutte le modifiche nell'altro plug-in rimarrebbero intatte.

Conclusione

I plugin estensibili sono davvero fantastici e ci danno spazio per molte possibilità di personalizzazione. Se rendi il tuo plugin estensibile, i tuoi utenti e altri sviluppatori ti adoreranno per questo.

Dai un'occhiata a plugin come WooCommerce, Easy Digital Downloads e ACF. Questi plugin sono estensibili e puoi facilmente dirlo perché numerosi altri plugin nella directory dei plugin di WordPress aggiungono loro funzionalità. Forniscono anche una vasta gamma di azioni e filtri che modificano vari aspetti dei plugin. Le regole pratiche che ho enumerato sopra sono emerse nel mio studio su di esse.

Ecco alcuni suggerimenti per rendere il tuo plug-in estensibile:

  • Segui il principio aperto/chiuso. Altre persone non dovrebbero dover modificare il tuo codice per modificare qualcosa.
  • Per rendere il tuo plugin estensibile, aggiungi hook in questi posti:

    • intorno e all'interno dei principali processi,
    • durante la creazione dell'HTML di output,
    • per modificare le query di post o database,
    • prima di restituire valori da una funzione.

  • Namespace i nomi dei tuoi hook con il nome del tuo plugin per evitare conflitti di denominazione.
  • Prova a passare altre variabili correlate all'hook, in modo che altre persone ottengano un contesto di ciò che sta accadendo nell'hook.
  • Non dimenticare di documentare gli hook del tuo plugin, in modo che altre persone possano conoscerli.

Ulteriori letture

Ecco alcune risorse se vuoi saperne di più sull'estensione dei plugin:

  • Come rendere estensibile il tuo plugin WordPress, GitHub
    Tutto il codice di esempio in questo articolo.
  • "Suggerimenti utili per iniziare con gli hook di WordPress", Thomas Maier, Smashing Magazine
  • "Come creare un plugin per WordPress", Daniel Pataki, Smashing Magazine
  • "Ganci", Manuale dei plug-in, WordPress.org