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.
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.
Risposte:
Fondamentalmente la " API Plugin " , che convoca filtri e hook, è costituita dalle seguenti funzioni:
apply_filters()
- eseguido_action
- eseguiapply_filters_ref_array()
- eseguido_action_ref_array()
- eseguiadd_filter()
- aggiungi allo stackadd_action()
- aggiungi allo stackComplessivamente 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 Array
che 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.
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 all
filtro.
Quando aggiungi un callback usando add_action
o 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_filter
stack:
$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']
)
);
}
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.