Come funzionano davvero i filtri e gli hook in PHP


21

Come funzionano effettivamente i filtri e gli hook in WordPress?

Sto chiedendo qualcosa di avanzato. Come viene implementato in PHP? Ad esempio, come raccoglie tutti i ganci dai diversi plugin e li "collega" ai ganci core ecc.


2
Per quanto ne so non ci sono "hook" o "filtri" in php, ci sono funzioni. Wordpress ha funzioni speciali che prima delle loro esecuzioni utilizzano una richiamata di altre funzioni.
Ofir Baruch,


3
@OfirBaruch, sono abbastanza sicuro che l'OP si riferisse alla loro implementazione in WordPress, e non stavo suggerendo che ci fosse qualche implementazione nativa di PHP.
Tom Auger,

Risposte:


33

Panoramica

Fondamentalmente la " API Plugin " , che convoca filtri e hook, è costituita dalle seguenti funzioni:

  1. apply_filters()- esegui
  2. do_action- esegui
  3. apply_filters_ref_array()- esegui
  4. do_action_ref_array()- esegui
  5. add_filter()- aggiungi allo stack
  6. add_action()- aggiungi allo stack

Interni di base

Complessivamente ci sono un paio di globi (cos'altro nel mondo di WordPress) coinvolti:

global $wp_filter, $wp_actions, $wp_current_filter, $merged_filters;

Il primo $wp_filterè un globale Arrayche contiene tutti i nomi di filtro come sottoarray. Ognuno di questi subarray contiene quindi ancora più subarray che sono callback convocati in un array prioritario.

Breve approfondimento

Quindi, quando viene chiamata una funzione di esecuzione , WordPress cerca quelle matrici globali per i tasti con quel nome. Quindi i callback allegati vengono eseguiti priorità dopo priorità. L'unica cosa che accade in anticipo sono le richiamate associate al allfiltro.

Quando aggiungi un callback usando add_actiono add_filter, WordPress prima calcola un ID "univoco" per non sovrascrivere i callback già collegati.

$idx = _wp_filter_build_unique_id($tag, $function_to_add, $priority);

Quindi aggiunge il callback allo global $wp_filterstack:

$wp_filter[ $tag ][ $priority ][ $idx ] = array(
    'function'      => $function_to_add,
    'accepted_args' => $accepted_args
);

Come puoi vedere l'array secondario principale è il $tag(o nome dell'azione / filtro), quindi tutto viene convocato con una priorità specifica e quindi la stringa di callback / ID "unica" viene utilizzata come chiave.

Successivamente, quando viene chiamato un filtro - che si verifica con $tag/ action- / filter-name - l'array viene cercato e vengono richiamati i callback. Come lo sta usando call_user_func_array, non importa davvero quanti argomenti siano allegati. WordPress lo risolve da solo.

foreach ( (array) current( $wp_filter[ $tag ] ) as $the_ )
{
    call_user_func_array(
        $the_['function'], 
        array_slice(
            $args, 
            0, 
            (int) $the_['accepted_args']
        )
    );
}

3
non dimenticare che mentre passa attraverso i callback, ordina l'esecuzione di più callback sullo stesso hook usando la loro "priorità", che è impostata (facoltativamente) con add_action () e apply_filters () e il valore predefinito è 10.
Tom Coclea

1
@TomAuger Non esitate a aggiungere ulteriori note e modifiche alla risposta.
Kaiser

5

Gli hook sono inclusi sia nei file core di WordPress che in alcuni file dei temi principali. Consentono di agganciare il contenuto in una posizione specifica nel file.

Un esempio è l'hook wp_head in WordPress. Puoi utilizzare questo hook nel tema figlio per aggiungere contenuti in quella posizione "

Esempio:

add_action('wp_head', 'add_content_to_head');
function add_content_to_head() {
echo 'Your Content';
}

Alcuni temi premium includono anche hook di azione che puoi usare in un tema figlio per fare la stessa cosa. Ecco una mappa visiva che include tutti gli hook di azione e la posizione in cui hanno prodotto i tuoi contenuti nel framework dei temi di Genesis.

Esempio:

add_action('genesis_header', 'add_content_to_header');
function add_content_to_header() {
echo 'Your Content';
}

Ecco come appare l'hook se hai aperto il file header.php nel framework del tema Genesis:

do_action( 'genesis_header' );

Ecco un elenco di hook di WordPress che puoi utilizzare in molti modi.

I filtri consentono di modificare l'output di una funzione esistente ed è incluso sia nei file core di WordPress che in alcuni framework di temi principali come Genesis.

Ecco un elenco dei filtri che è possibile utilizzare con Genesis Design Framework

Ecco un elenco dei filtri inclusi in WordPress

Ecco un esempio di come è possibile utilizzare un filtro in un framework di temi come Genesis:

add_filter( 'comment_author_says_text', 'custom_comment_author_says_text' );
function custom_comment_author_says_text() {
return 'author says';
}

Il codice sopra può essere utilizzato in un tema figlio per modificare l'autore dice il testo nei tuoi commenti. Funziona con qualsiasi tema.

Ecco un altro esempio che personalizza la lunghezza degli estratti in 50 parole:

add_filter( 'excerpt_length', 'change_excerpt_length' );
function change_excerpt_length($length) {
return 50; 
}

Troverai la funzione the_excerpt () nel file wp- Includes / post-template.php.

Ecco come appare:

  function the_excerpt() {
        echo apply_filters('the_excerpt', get_the_excerpt());
}

Puoi anche usare hook e filtri nei plugin per fare esattamente la stessa cosa e il codice non andrà perso quando aggiorni il tema principale o WordPress.

Fondamentalmente, hook e filtri consentono di personalizzare e modificare sia WordPress che il tema principale senza modificare i file principali di WordPress oi file del tema principale.

È notevolmente più semplice personalizzare un tema figlio quando il framework del tema padre include hook e filtri perché non è mai necessario modificare i file modello dei temi padre. In questo modo puoi cambiare in sicurezza anche i temi.


2
Questa è una grande panoramica generale di hook e filtri, ma temo che manchi totalmente la domanda dell'OP, che riguarda gli interni di come funzionano gli hook e come WordPress li crea, li archivia e li elabora. Bella risposta; dovresti probabilmente collegarti al tuo tutorial sui siti WP.
Tom Auger,

Ok lo cancellerò. Peccato che avrei dovuto leggere meglio la domanda, ma ho pensato che le risposte già fornite sarebbero state più facili da capire per i principianti se avessero saputo prima le basi.
Brad Dalton,

2
Brad, l'ho cancellato perché penso che potrebbe essere utile avere anche queste informazioni qui. Se non sei d'accordo, menzionami / esegui il ping qui e lo rimuoverò di nuovo.
Kaiser
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.