La chiave per le basi flessibili di WordPress è l'uso di ganci. Sia che si tratti di temi, plug-in o core, gli hook consentono una crescita senza precedenti garantendo al tempo stesso la compatibilità con le versioni future di WordPress. Di conseguenza, comprenderli dovrebbe essere indubbiamente parte del repertorio di qualsiasi sviluppatore. Partecipa scoprendo le complessità di questo semplice ma sofisticato sistema dall'interno verso l'esterno.
Come una tabella di marcia per questo articolo, esamineremo il concetto dietro gli ami, la loro implementazione e, naturalmente, gli esempi.
"In parole povere, un gancio è un segnaposto per un'azione."
Dietro ogni software ben scritto c'è un solido concetto che risponde alle domande su cosa e perché. I ganci non fanno eccezione. In parole povere, un gancio è un segnaposto per un'azione. Quando si verifica un evento significativo, come la pubblicazione di un post, viene attivato un hook che consente l'esecuzione delle relative reazioni. In termini di sviluppatori, si può pensare agli hook come all'implementazione di un sistema basato sugli eventi.
Più che una semplice definizione, un concetto richiede un supporto al ragionamento che chiarisca perché è utile. I ganci svolgono un ruolo fondamentale in WordPress a causa della natura in continua evoluzione del progetto. Con centinaia di sviluppatori che aggiornano costantemente il sistema, non è possibile modificare i file principali per ciascun plugin, tema o personalizzazione speciale, poiché questi cambieranno frequentemente. Al contrario, è necessario un framework per estendere il sistema, per consentire alle funzionalità esterne di avere lo stesso effetto delle manipolazioni interne. I ganci sono la chiave di questo quadro.
Come sviluppatore, il proprio ruolo è esteso non solo a capire cosa fa qualcosa o perché è fatto, ma anche a capire come viene creato. In altre parole, per comprendere appieno il sistema degli hook, è necessario capire come vengono implementati.
Proprio come in un test a scelta multipla, però, guardare direttamente alle risposte per primo non è necessariamente l'idea migliore. Come suggeriscono molte strategie di prova, spesso è meglio leggere la domanda, formulare i propri pensieri sulla risposta e quindi scegliere la scelta che più assomiglia al tuo ragionamento. Un metodo simile può essere messo in atto quando si comprendono le implementazioni dello sviluppo del software; piuttosto che guardare il codice di qualcun altro per capire come viene realizzata una caratteristica, spesso è ancora più utile implementarla prima tu stesso e poi tornare ad esaminare come viene effettivamente eseguita. Questo è esattamente ciò che faremo.
Piuttosto che guardare il codice di qualcun altro per capire come viene realizzata una funzionalità, spesso è ancora più utile implementarla prima tu stesso e poi tornare ad esaminare come viene effettivamente eseguita.
Per ottenere informazioni dettagliate su come viene implementato un sistema, la documentazione è spesso un inizio utile. Esaminiamo i riepiloghi delle due principali funzioni di hook di WordPress secondo il Codex:
add_action ($ hook, $ function [, $ priority [, $ numArgs]]))
- Specifica un gestore di funzioni, $ funzione
, essere chiamato una volta un certo gancio, $ gancio
, è attivato a causa dell'occorrenza di un evento. $ priorità
determina se questo gestore di funzioni viene chiamato prima o dopo altri gestori di funzioni e valori predefiniti a 10. Priorità inferiori determinano il richiamo di una funzione in precedenza e viceversa. $ numArgs
è il numero di argomenti che il gestore di funzioni prenderà e il valore predefinito è 1.do_action ($ hook [, $ arg1 [, $ arg2 [, $ arg3 [,?]]]])
- Attiva un certo gancio, $ gancio
, chiamando tutte le funzioni di gestione con gli argomenti opzionali $ arg1
, $ arg2
, $ arg3
, eccetera.Con la documentazione in mano, è il momento di fare alcune inferenze su queste due funzioni. add_action
ha solo bisogno di associare una funzione, una priorità e un numero di argomenti con una stringa. Questo sembra il lavoro perfetto per un array PHP, che agisce come una mappa hash che memorizza le coppie chiave-valore. do_action
è ancora più banale, richiede una semplice ricerca in questo stesso array per trovare i corrispondenti gestori di funzione e successivamente chiamarli. Con le nostre intuizioni in mente, è ora di passare alla nostra implementazione.
Poiché stiamo facendo questo per ottenere informazioni dettagliate sul sistema di aggancio di WordPress, non è necessario implementare queste due funzioni letteralmente dalla documentazione. Concentriamoci invece sulle loro implementazioni senza gli argomenti opzionali per risparmiare tempo e ottenere comunque il succo di ciò.
Prima di iniziare, descriviamo uno schema:
add_action
memorizzerà il nome del gancio e un insieme di gestori di funzioni corrispondenti come coppia chiave-valore nell'array.do_action
recupererà i corrispondenti gestori di funzioni per un determinato nome di hook e chiamerà ciascuno di essi.Questo produce il seguente codice:
$ actions = array (); function add_action ($ hook, $ function) global $ actions; // crea una matrice di handler di funzioni se non esiste già se (! isset ($ actions [$ hook])) $ actions [$ hook] = array (); // aggiunge la funzione corrente all'elenco dei gestori di funzione $ actions [$ hook] [] = $ function; function do_action ($ hook) global $ actions; if (isset ($ actions [$ hook])) // chiama ogni gestore di funzioni associato a questo hook foreach ($ actions [$ hook] come $ function) call_user_func ($ function);
Non è male; abbiamo implementato un sistema di aggancio versatile in circa 20 linee di codice. Ora che abbiamo raccolto un'idea di come funzionano i ganci, analizziamo il codice core WordPress per confermare la nostra ipotesi.
Uno strumento per navigare rapidamente attraverso questo codice è il PHP Cross Reference di Yoast di WordPress Source. Alla ricerca di add_action
produce il seguente codice:
function add_action ($ tag, $ function_to_add, $ priority = 10, $ accepted_args = 1) return add_filter ($ tag, $ function_to_add, $ priority, $ accepted_args); function add_filter ($ tag, $ function_to_add, $ priority = 10, $ accepted_args = 1) global $ wp_filter, $ merged_filters; $ idx = _wp_filter_build_unique_id ($ tag, $ function_to_add, $ priority); $ wp_filter [$ tag] [$ priority] [$ idx] = array ('function' => $ function_to_add, 'accepted_args' => $ accepted_args); unset ($ merged_filters [$ tag]); ritorna vero;
add_action
chiamate add_filter
che, non sorprendentemente, aggiunge la funzione data a un array digitato dal nome del gancio, $ tag
. Anche se c'è un po 'di più a causa del $ priorità
e $ accepted_args
parametri, questa funzione è essenzialmente d'accordo con la nostra, confermando i nostri sospetti. do_action
, anche se più lungo e un po 'più complesso, si riduce al seguente codice:
function do_action ($ tag, $ arg = ") [codice omesso che registra statistiche, elabora argomenti e gestisce filtri] do foreach ((array) corrente ($ wp_filter [$ tag]) come $ the_) if (! is_null ($ the _ ['function'])) call_user_func_array ($ the _ ['function'], array_slice ($ args, 0, (int) $ the _ ['accepted_args'])) while (next ($ wp_filter [$ tag])! == false); [Codice omesso che ripulisce]
Correre attraverso le funzioni associate e chiamarle non è strano per tutti noi; in effetti, è esattamente ciò che abbiamo ipotizzato nella nostra implementazione. Di conseguenza, iniziando con i nostri pensieri sul codice non solo ci ha aiutato a comprenderlo meglio, ma abbiamo anche richiesto un pensiero critico e una soluzione dei problemi essenziale per lo sviluppo del software.
Con la nostra comprensione di cosa, perché e quanto bene in mano, è il momento di passare a due esempi. Il primo è un gioco su RSS; piuttosto che fornire notifiche tramite syndication, perché non usare invece la posta elettronica?
Per implementare il nostro sistema, dovremo cercare quando viene pubblicato un post. Ma quale gancio dovremmo usare? Il riferimento all'azione dell'API fornisce un elenco di hook e descrizioni degli eventi associati che possono aiutarci a identificare esattamente questo. Infatti, il publish_post
la descrizione dell'amo corrisponde a ciò di cui abbiamo bisogno, quindi aggiungiamo un gestore di funzione ad esso:
add_action ('publish_post', 'notify_via_email');
Non resta che inviare una notifica via e-mail a qualcuno in notify_via_email
gestore di funzioni. Si noti che il riferimento all'azione dell'API specifica che il publish_post
hook passa l'ID del post come argomento alla nostra funzione di gestione. Questo ci permetterà di ottenere informazioni sul post tramite il get_post
funzione, in questo modo:
funzione notify_via_email ($ post_id) $ post = get_post ($ post_id); $ a = '[email protected]'; $ subject = 'Pubblica pubblicato su'. get_bloginfo ('name'); $ message = $ post-> post_title. 'è stato pubblicato su'. get_bloginfo ('nome'). ' come di ' . $ post-> post_date. '. Puoi vederlo a '. get_permalink ($ post_id). ''; wp_mail ($ a, $ subject, $ message);
Dopo aver recuperato il post, utilizziamo il titolo, la data e il permalink nel nostro messaggio di posta elettronica. Viene quindi inviato tramite wp_mail
funzione, che richiede un destinatario, un soggetto e un messaggio come parametri. Con ciò, il nostro semplice sistema di notifica via e-mail è completo. Si noti che non è consigliabile chiamare wp_mail
numerose volte contemporaneamente, poiché è destinato a presentare un ritardo significativo nel tempo di caricamento della pagina una volta che viene premuto il pulsante Pubblica post.
Inizialmente, potrebbe sembrare che un tema sia un mezzo più adatto per tale codice. Al contrario, attraverso, come tema di un sito è suscettibile di revisione e cambiamento. Di conseguenza, il codice di analisi potrebbe facilmente perdersi in una transizione da un tema all'altro.
Anche se leggermente forzata, la nostra prima applicazione è stata una rapida introduzione all'utilizzo di ganci. Questo secondo esempio, tuttavia, si presterà molto di più all'uso nel mondo reale. Creeremo un semplice plug-in di Google Analytics che inserisce automaticamente il codice di monitoraggio nel piè di pagina.
Inizialmente, potrebbe sembrare che un tema sia un mezzo più adatto per tale codice. Al contrario, attraverso, come tema di un sito è suscettibile di revisione e cambiamento. Di conseguenza, il codice di analisi potrebbe facilmente perdersi in una transizione da un tema all'altro. La creazione di un plugin ignora questo svantaggio; poiché rimarrà attivo indipendentemente dal tema utilizzato, il codice di analisi sarà ancora presente e rimuoverà la necessità di manutenzione del tema.
Ma come possiamo inserire il codice nel footer di un sito web? Anche questo è fatto tramite ganci. Se hai già lavorato su temi WordPress, probabilmente hai chiamato il wp_head
e wp_footer
funzioni nella testa e nel footer del tuo sito web, rispettivamente. Entrambe queste funzioni sono presenti per attivare semplicemente i ganci in modo che i plug-in possano facilmente inserire il codice in queste aree vitali della pagina. Di conseguenza, aggiungeremo semplicemente un'azione al wp_footer
gancio:
add_action ('wp_footer', 'add_google_analytics_code');
Nostro add_google_analytics_code
funzione, come suggerisce il nome, stampa il codice di Google Analytics:
Ricordati di cambiare UA-XXXXX-X
al tuo ID sito specifico e sei pronto! Basta aggiungere questo codice a un file e caricarlo nella directory dei plugin di WordPress. Assicurati di inserire un'intestazione del plugin, in questo modo:
Non dimenticare di cambiare il nome dell'autore, l'URI dell'autore e, naturalmente, attivare il plugin!
Suddividendo i ganci in un concetto, un'implementazione ed esempi, li abbiamo esaminati efficacemente dall'interno del nucleo di WordPress all'esterno in un'applicazione reale. Piuttosto che limitarsi a guardare il codice di base di WordPress, abbiamo implementato la nostra versione di hook per deduzione, consentendoci di ottenere una comprensione più approfondita, simile a uno sviluppatore di questo potente sistema. Infine, con un'applicazione plug-in di Google Analytics reale, abbiamo ottenuto informazioni preliminari su come possono essere davvero utili gli hook. Assicurati di unirti a noi la prossima volta e sentiti libero di condividere i tuoi usi innovativi degli hook nei commenti qui sotto!