Diferencia entre add_filter y apply_filters
He buscado una explicación adecuada sobre la diferencia entre add_filter()
y apply_filters()
aquí pero no he podido encontrar una.
¿Alguien puede decirme qué información o lógica considerar antes de usar add_filter
o apply_filters
en un contexto?
¿Qué hace que el uso de uno sea imperativo y no el otro?
¿Es correcto que
add_filter
solo agrega una función a la cola de funciones que esperan ser ejecutadas en una variable yapply_filters
ejecuta las funciones en orden?¿También es correcto que
apply_filters
cuando se llama con un argumento (el nombre de la función a ejecutar) ejecutará esa función antes que todas las demás (si existen) en la cola?

La mayoría de lo siguiente se puede encontrar en el Codex:
apply_filters
Las funciones de callback adjuntas al hook de filtro
$tag
se invocan llamando a esta función. Esta función se puede utilizar para crear un nuevo hook de filtro simplemente llamando a esta función con el nombre del nuevo hook especificado usando el parámetro $tag.
$value = apply_filters( $tag, $value, $var_1, $var_2, ... );
En esencia:
Usas apply_filters
para filtrar un $value
dado - con respecto al valor en sí mismo, así como opcionalmente a las variables proporcionadas $var_1
hasta $var_n
.
add_filter
Engancha una función a una acción de filtro específica.
add_filter( $tag, $function_to_add, $priority, $accepted_args );
En esencia:
Usas add_filter
para enganchar una función personalizada a la acción de filtro dada ($tag
), que podrías haber generado con apply_filters
antes (o era una acción de filtro integrada o provenía de un plugin/tu tema).
Así que, aquí hay un ejemplo ficticio:
function print_initials( $name ) {
if ( ! is_string( $name ) ) {
return;
}
$fragments = explode( ' ', $name );
/**
* Filtra si se imprimen las iniciales en orden inverso.
*
* @param bool $reverse ¿Imprimir las iniciales en orden inverso?
*/
if ( apply_filters( 'reverse_initials', FALSE ) ) {
$fragments = array_reverse( $fragments );
}
foreach ( $fragments as $f ) {
echo substr( $f, 0, 1 );
}
}
print_initials( 'Some Guy' ); // muestra: SG
add_filter( 'reverse_initials', '__return_true' );
print_initials( 'Some Guy' ); // muestra: GS
Ahora, si solo llamamos a nuestra función tal cual, las iniciales se imprimen de izquierda a derecha—porque esto es lo que definimos como comportamiento predeterminado.
La segunda vez, obtenemos las iniciales en orden inverso—porque la función de filtro __return_true
, que está enganchada a nuestra acción de filtro, siempre devuelve TRUE
y, por lo tanto, hace que las iniciales se muestren de derecha a izquierda.

El ejemplo anterior es el clásico que mata a un desarrollador novato...
Explicado de manera directa pero comprensible, puedes usar apply_filters
para crear un filtro personalizado específico que luego podrás modificar a través de add_filter
.
Por otro lado, si usas un hook ya existente, puedes usar directamente add_filter
...
La lógica aquí es la típica "no-lógica" del desarrollo, así que necesitas ver más ejemplos y practicar un poco para "entender" cómo funcionan...
Sé que incluso mi explicación podría no sonar del todo clara (y muchos de nuestros compañeros podrían matarme por ser incorrecta), pero me parece la explicación más comprensible que he encontrado en Internet.

Esto no proporciona una respuesta a la pregunta. Una vez que tengas suficiente reputación podrás comentar en cualquier publicación; en su lugar, proporciona respuestas que no requieran aclaraciones del que pregunta. - Desde la Revisión
