Diferencia entre add_filter y apply_filters

30 ene 2014, 12:52:11
Vistas: 34.8K
Votos: 25

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 y apply_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?

3
Comentarios

¿Qué hay en la documentación existente aquí y aquí que no lo explica adecuadamente para ti?

t31os t31os
30 ene 2014 13:01:40

Creo que esta es realmente una buena pregunta. Como nuevo desarrollador de WordPress, este puede ser un concepto confuso.

Shawn Shawn
29 sept 2014 21:00:59

Todos fuimos principiantes alguna vez.

Scott C Wilson Scott C Wilson
6 oct 2024 19:21:33
Todas las respuestas a la pregunta 2
1
33

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.

30 ene 2014 13:03:54
Comentarios

Esta es una gran respuesta y muestra cómo puedes anular los filtros. Gracias.

Shawn Shawn
29 sept 2014 21:01:47
1

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.

23 abr 2023 10:25:11
Comentarios

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

cjbj cjbj
26 abr 2023 12:25:48