Pregunta:
¿Cómo funcionan realmente los filtros y ganchos en WordPress?
Estoy preguntando por algo avanzado. ¿Cómo se implementa en PHP? Por ejemplo, ¿cómo recopila todos los ganchos de los diferentes complementos y los "une" a los ganchos centrales, etc.?
Respuesta:
Descripción general
Básicamente, la " API de complementos ", que invoca filtros y ganchos, consta de las siguientes funciones:
-
apply_filters()
– ejecutar -
do_action
– ejecutar -
apply_filters_ref_array()
– ejecutar -
do_action_ref_array()
– ejecutar -
add_filter()
– agregar a la pila -
add_action()
– agregar a la pila
Internos básicos
En general, hay un par de globales (qué más en el mundo de WordPress) involucrados:
global $wp_filter, $wp_actions, $wp_current_filter, $merged_filters;
El primero $wp_filter
es un Array
global que contiene todos los nombres de filtro como subarreglos. Cada uno de esos subarreglos contiene aún más subarreglos que son devoluciones de llamada convocadas bajo un arreglo de prioridad.
Breve en profundidad
Entonces, cuando se llama a una función de ejecución , WordPress busca en esas matrices globales las claves con ese nombre. Luego, las devoluciones de llamada adjuntas se ejecutan prioridad tras prioridad. Lo único que sucede al principio son las devoluciones de llamada adjuntas al filtro de all
.
Cuando agrega una devolución de llamada usando add_action
o add_filter
, WordPress primero calcula una ID "única" para no sobrescribir las devoluciones de llamada ya adjuntas.
$idx = _wp_filter_build_unique_id($tag, $function_to_add, $priority);
Luego agrega su devolución de llamada a la pila global $wp_filter
:
$wp_filter[ $tag ][ $priority ][ $idx ] = array(
'function' => $function_to_add,
'accepted_args' => $accepted_args
);
Como puede ver, la submatriz principal es la $tag
(o el nombre de la acción / filtro), luego todo se convoca bajo una prioridad específica, y luego la cadena de identificación / devolución de llamada "única" se usa como clave.
Más tarde, cuando se llama a un filtro, lo que sucede con $tag
/ action- / filter-name, se busca la matriz y se llaman las devoluciones de llamada. Como está usando call_user_func_array
, realmente no importa cuántos argumentos se adjuntan. WordPress lo resuelve por sí solo.
foreach ( (array) current( $wp_filter[ $tag ] ) as $the_ )
{
call_user_func_array(
$the_['function'],
array_slice(
$args,
0,
(int) $the_['accepted_args']
)
);
}