In la parte precedente della nostra serie abbiamo creato la base per un plugin per WordPress riconoscibile dal core. Oggi impareremo come modificare effettivamente la funzionalità di default del core.

Il concetto di ganci, azioni e filtri è responsabile di ciò; essere il vero cuore dell'intero sistema di plugin WordPress.

Tutto parte dai "ganci" forniti dal core stesso.

Cos'è un "gancio"? È un posto appositamente contrassegnato nel codice (di qualsiasi script), in cui alcune funzioni deliberatamente registrate - "collegate" - possono essere eseguite nell'ordine definito al momento della registrazione.

WordPress ha due tipi di hook che differiscono nel loro scopo:

  • Gancio di azione: segna il punto in cui eseguire un'azione, ad esempio l'input di processo e i risultati di memorizzazione in un database
  • Hook filtro: indica il punto in cui applicare una modifica a un valore (normalmente fornito come variabile), in modo che il codice seguente utilizzi il valore corretto

Entriamo nei dettagli ...

Lavorare con le azioni

La logica comune delle azioni di WordPress è molto semplice:

  1. Segna il luogo, dove dovrebbe andare il codice personalizzato, con un "hook di azione" e i suoi parametri
  2. Crea la funzione di azione che esegue il nuovo codice utilizzando (se necessario) i parametri forniti dal gancio
  3. Registra l'azione (n. 2) da eseguire quando il gancio (n. 1) viene attivato con una certa priorità
  4. Quando WordPress carica la pagina richiesta e trova il gancio, cercherà tutte le funzioni "agganciate" a esso e le eseguirà una per una in base alla loro priorità

Per eseguire l'attività # 1 abbiamo la funzione 'do_action':

do_action($tag, $arg_1, $arg_2, ... , $arg_n);

Accetta i seguenti parametri: $ tag - il "nome" del gancio che aiuta a identificare l'hook specifico e distinguerlo tra gli altri; $ arg_1, $ arg_2, ..., $ arg_n - valori per le azioni da accettare come parametri. Potrebbero esserci tanti argomenti, se necessario, da zero fino a un importo ragionevole.

WordPress stesso ha un sacco di ganci predefiniti da usare:

do_action( 'init' );

Questo è un caso molto semplice senza parametri aggiuntivi. Questo hook viene attivato quando viene impostata la maggior parte di WordPress ed è giunto il momento di registrare oggetti personalizzati, come ad esempio il tipo di post personalizzato.

do_action('save_post', $post_id, $post);

In questo esempio l'hook viene attivato quando il post viene salvato e fornisce due parametri aggiuntivi per operare con - post_id e postare l'oggetto contenente tutti i dati dal post salvato.

Ma creare ami non è solo un privilegio del core team; ogni sviluppatore può creare un hook personalizzato per il plugin (o tema). Grazie a questo abbiamo un sacco di energia, ad esempio, i framework a tema consentono ai temi figlio di alterare non solo gli stili ma anche il markup dei genitori senza sovrascrivere interi file.

do_action( 'my_truly_custom_hook' );

Quando abbiamo trovato (o creato) un hook appropriato e creato una funzione personalizzata per questo, dovremmo registrare l'ultima versione per l'esecuzione con 'add_action'.

add_action($tag, $function_to_add, $priority, $accepted_args_number);

Come ci si può aspettare, il metodo 'add_action' accetta due parametri obbligatori: $ tag: il nome del hook appropriato e $ function_to_add: il nome della funzione che deve essere eseguita. Gli altri due parametri sono facoltativi: $ priority: un numero intero per specificare l'ordine in cui vengono eseguite le funzioni registrate (per impostazione predefinita, 10), $ accepted_args_number: numero di argomenti che la funzione registrata sta per accettare (per impostazione predefinita, 1) .

Diamo un'occhiata a un esempio per illustrare l'intero processo. Supponiamo di voler aggiungere un piccolo avviso nella parte inferiore del nostro sito. Potremmo usare l'hook 'wp_footer' per questo perché fa parte del codice footer obbligatorio che ogni tema dovrebbe includere.

function msp_helloworld_footer_notice(){echo "
Hello, I'm your custom notice
";}add_action('wp_footer', 'msp_helloworld_footer_notice');

In questo esempio creiamo una funzione prefissata che emette semplicemente il markup dell'avviso (l'importanza dei prefissi di cui abbiamo discusso in l'articolo precedente , quindi per favore fai riferimento ad esso per i dettagli) e poi collegalo a 'wp_footer'. Una volta incluso questo codice nel nostro file plugin (anche discusso nel precedente articolo), vedremo il risultato sul sito.

cnotice

Lavorare con i filtri

I filtri funzionano con la stessa logica delle azioni. L'unica differenza è che non eseguono solo una parte di codice in un determinato posto. Eseguono questo codice PER MODIFICARE un valore dato loro dal gancio. Ciò significa che ogni hook di filtro ha il valore associato (nella maggior parte dei casi è supportato da una variabile).

La funzione che esegue il filtraggio dovrebbe assumere questo valore, modificarlo in qualche modo e quindi restituirlo per un ulteriore utilizzo. In modo che la sintassi delle funzioni responsabili di hook e filtri sia leggermente diversa.

apply_filters($tag, $value_to_filter, $arg_1, $arg_2, ... , $arg_n);

La funzione 'apply_filter' crea un hook di filtro con $ tag name e il parametro obbligatorio $ value_to_filter (potrebbe essere vuoto, ma dovrebbe essere presente per le migliori pratiche). Altri argomenti sono opzionali e funzionano allo stesso modo delle azioni.

filter_function($value_to_filter, $arg_1, $arg_2, ... , $arg_n){//filtering code goes herereturn $value_to_filter; //value has to be returned back}

Questa è una funzione di scheletro di filtro che dimostra che dovrebbe: a) accettare almeno un argomento, il valore per la modifica; e b) restituire il valore alla fine.

add_filter($tag, $function_to_add, $priority, $accepted_args);

La funzione 'add_filter' registra una funzione con un nome dato come argomento $ function_to_add per l'hook del filtro $ tag. Gli argomenti opzionali - $ priority e $ accepted_args - funzionano allo stesso modo degli hook di azione.

Cerchiamo di dimostrare l'intero processo in azione: un compito plugin comune è aggiungere del contenuto alla fine di un post. Se osserviamo più da vicino il tag del modello 'the_content' ( queryposts.com/function/the_content ), che viene normalmente utilizzato per generare il contenuto di un post in un tema, troveremo che contiene il seguente hook di filtro:

$content = apply_filters('the_content', $content);

Usando questo hook possiamo aggiungere facilmente qualcosa alla fine del post nel modo seguente:

function msp_helloworld_post_footer($content) {$content .= "";return $content;}  add_filter ('the_content', 'msp_helloworld_post_footer', 100); 

Si prega di notare che qui usiamo un numero piuttosto elevato di priorità per garantire che tutti i filtri predefiniti siano stati applicati prima del nostro 'msp_helloworld_post_footer'. Dopo aver incluso il codice nel file del plugin dovremmo vedere il risultato sul sito:

pfooter

Come trovare i ganci

Ora dovrebbe essere ovvio che per implementare le funzionalità di azione e filtro abbiamo bisogno di sapere quali ganci sono disponibili.

Il codice WordPress fornisce un Riferimento di azione con la maggior parte dei ganci di azione attivati ​​al carico di pagina tipico e a Riferimento del filtro con un elenco di filtri comunemente usati. Questi riferimenti sono utili per comprendere l'ordine delle azioni e la logica dei filtri in modo da poter scegliere dove e quando la funzionalità può e deve essere iniettata.

Dopodiché sei pronto per il viaggio nel codice sorgente. Puoi semplicemente eseguire una ricerca attraverso i file WordPress per le parole chiave 'do_action' e 'apply_filters' per trovare il gancio che ti serve.

Comprensione Logica di query di WordPress potrebbe anche aiutarti a capire dove possono essere cercati alcuni ganci.

Infine, puoi fare riferimento a Database degli hook di WordPress che contiene informazioni complete sugli hook nei file core.

Operazioni avanzate con ganci

Oltre ad essere aggiunto al tuo plugin, azioni e filtri possono anche essere rimossi con una sintassi simile.

Le azioni possono essere rimosse nel modo seguente:

remove_action($tag, $function_to_remove, $priority, $accepted_args);remove_all_actions($tag, $priority);

Come probabilmente hai intuito 'remove_action' rimuove una determinata azione registrata per un particolare hook (devi indicare correttamente la priorità e il numero di argomenti così come sono stati utilizzati alla registrazione), e 'remove_all_actions' aiuta a rimuovere tutte le azioni registrate con un determinato aggancia con una data priorità (se l'argomento di priorità è omesso, la funzione rimuoverà tutte le azioni).

Probabilmente hai sentito parlare di un consiglio di sicurezza popolare per nascondere la versione di WordPress dalla sezione principale del sito. Questo è un lavoro per "remove_action".

Prima di tutto troviamo il codice che aggancia la funzione 'wp_generator' per stampare le informazioni sulla versione sfogliando /wp-includes/default-filters.php . Il codice che esegue ciò si presenta come segue:

add_action('wp_head', 'wp_generator');

Per eliminare l'effetto di questo codice dovremmo farlo da qualche parte nel nostro plugin, includere la funzione opposta:

remove_action('wp_head', 'wp_generator');

I filtri possono essere rimossi in modo simile:

remove_filter($tag, $function_to_remove, $priority, $accepted_args);remove_all_filters($tag, $priority);

Il API plugin fornisce inoltre agli sviluppatori un modo per rilevare se il particolare hook ha registrato le funzioni da eseguire:

has_action($tag, $function_to_check);has_filter($tag, $function_to_check);

Entrambe le funzioni verificano se una determinata azione o filtro è registrato per un hook e restituisce: true in caso di successo, false in caso di fallimento. All'interno della funzione uncinata abbiamo la possibilità di verificare quale hook ha attivato la sua esecuzione nel modo seguente:

if('hook_to_check_name' === current_filter()){//do stuff related to 'hook_to_check_name' hook}

Nonostante il nome, "current_filter" funziona non solo con i filtri ma anche con le azioni. Per il set completo delle funzioni dell'API del plugin fare riferimento a Codice .

Caso del mondo reale

Cerchiamo di scavare lo scheletro del plugin che abbiamo preparato la parte precedente della serie e respirare un po 'di vita in esso.

Inseriremo il file 'core.php' (la parte centrale del nostro plugin pensata per portare la maggior parte delle funzionalità) con il codice che risolve un compito reale con l'aiuto di azioni e filtri.

Cosa faremo? Supponiamo che il tuo sito WordPress accetti i post degli ospiti di diversi autori, ma non concede loro il permesso di creare i propri account per la pubblicazione. Significa che l'utente, che ha pubblicato l'articolo e il vero autore (l'ospite) sono persone diverse. Dovrai assicurarti che l'autore effettivo riceva credito. Questo può essere fatto con la tassonomia personalizzata.

Cerchiamo di creare un tassonomia personalizzata per gestire il nome dell'autore ospite (come termine) e il bio dell'autore breve (come descrizione). Saremo in grado di assegnare i nomi degli autori come qualsiasi altro termine di tassonomia (come tag) ai post. Dopodiché diventa possibile stampare la casella di un autore subito dopo il testo del post. Ecco il codice:

/** Hook plugin's action and filters **/function msp_helloworld_init(){add_action('init', 'msp_helloworld_taxonomies');add_filter('the_content', 'msp_helloworld_author_block_filter');add_filter('post_class', 'msp_helloworld_post_class');}add_action('plugins_loaded', 'msp_helloworld_init');/** Register custom taxonomy **/function msp_helloworld_taxonomies(){$args = array('labels' => array('name'          => 'Guest authors','singular_name' => 'Guest author'),'show_in_nav_menus' => false);register_taxonomy('gauthor', array('post'), $args);}  / ** Crea markup box dell'autore ** / function msp_helloworld_author_block () {global $ post; $ author_terms = wp_get_object_terms ($ post-> ID, 'gauthor'); if (vuoto ($ author_terms)) return; $ name = stripslashes ( $ author_terms [0] -> name); $ url = esc_url (get_term_link ($ author_terms [0])); $ desc = wp_filter_post_kses ($ author_terms [0] -> description); $ out = " 
"; $ out. ="
Questo è un post ospite di {$name}
"; $ out. ="
{$desc}
"; return $ out;} / ** Aggiungi box dell'autore alla fine del post ** / function msp_helloworld_author_block_filter ($ content) {if (is_single ()) $ content. = msp_helloworld_author_block (); return $ content;} / * * Aggiungi una classe CSS personalizzata al contenitore del post ** / function msp_helloworld_post_class ($ post_class) {global $ post; $ author_terms = wp_get_object_terms ($ post-> ID, 'gauthor'); if (! Empty ($ author_terms)) {$post_class[] = 'gauthor';} return $ post_class;}

Come puoi vedere, abbiamo creato un'azione per registrare una tassonomia personalizzata e applicarla al gancio "init": questa è una pratica consigliata. Dopodiché abbiamo creato il tag modello responsabile del markup della casella dell'autore utilizzando le funzioni native di WordPress come "wp_get_object_terms". Successivamente abbiamo allegato questa casella alla fine del contenuto del post utilizzando il hook del filtro 'the_content'. Infine, abbiamo aggiunto la classe CSS personalizzata per il contenitore dei post degli ospiti per la flessibilità dello stile nel tema. Dopo aver applicato alcuni stili possiamo vedere il risultato:

gauthor

Conclusione

Azioni e filtri sono la parte più importante di qualsiasi sviluppo di WordPress. Ora che capisci la loro logica e il loro comportamento, sei pronto per i tuoi esperimenti.

Fai clic qui per scaricare il nostro esteso esempio di plugin "Hello World" da utilizzare come scheletro per il tuo sviluppo.

Quali usi hai trovato per le azioni e i filtri di WordPress? Cosa ti piacerebbe vedere trattato nella prossima parte di questa serie? Fateci sapere nei commenti.

Immagine in evidenza, Immagine del modulo via Shutterstock