Diferencia entre add_filter y apply_filters

17

He buscado una explicación adecuada de la diferencia entre add_filter()y apply_filters()aquí, pero no pude encontrarla.

¿Alguien puede decirme qué información o lógica considerar antes de usar add_filtero apply_filtersen un contexto?

¿Eso hace que el uso de uno sea imperativo y no el otro?

  • ¿Es correcto que add_filtersolo agrega una función a la cola de funciones que esperan ejecutarse en una variable y apply_filtersejecuta las funciones en orden?

  • ¿También es correcto que apply_filterscuando se llama con un argumento (el nombre de la función que se ejecutará) ejecutará esa función antes que todas las demás (si existen) en la cola?

hanachi
fuente
2
¿Qué pasa con la documentación existente aquí y aquí que no te lo explica adecuadamente?
t31os
3
Creo que esta es realmente una buena pregunta. Como nuevo desarrollador de WordPress, este puede ser un concepto confuso.
Shawn

Respuestas:

26

La mayoría de lo siguiente se puede encontrar en el Codex :


apply_filters

Las funciones de devolución de llamada asociadas al enlace de filtro $tagse invocan llamando a esta función. Esta función se puede usar para crear un nuevo enlace de filtro simplemente llamando a esta función con el nombre del nuevo enlace especificado usando el parámetro $ tag.

$value = apply_filters( $tag, $value, $var_1, $var_2, ... );

En esencia:
Se utiliza apply_filterspara filtrar un determinado $value- con respecto al valor en sí, así como variables opcionalmente proporcionados $var_1a través $var_n.


add_filter

Enganche una función a una acción de filtro específica.

add_filter( $tag, $function_to_add, $priority, $accepted_args );

En esencia: se
utiliza add_filterpara enganchar una función personalizada a la acción de filtro dada ( $tag), que podría haber generado apply_filtersantes (o fue una acción de filtro incorporada o se deriva de un complemento / su tema).


Entonces, aquí hay un ejemplo ficticio :

function print_initials( $name ) {

    if ( ! is_string( $name ) ) {
        return;
    }

    $fragments = explode( ' ', $name );

    /**
     * Filter wether to print initials in reverse order.
     *
     * @param bool $reverse Print initials in reverse order?
     */
    if ( apply_filters( 'reverse_initials', FALSE ) ) {
        $fragments = array_reverse( $fragments );
    }

    foreach ( $fragments as $f ) {
        echo substr( $f, 0, 1 );
    }
}

print_initials( 'Some Guy' ); // outputs: SG

add_filter( 'reverse_initials', '__return_true' );

print_initials( 'Some Guy' ); // outputs: GS

Ahora, si solo llamamos a nuestra función tal como está, 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 regresa TRUEy, por lo tanto, hace que las iniciales se emitan de derecha a izquierda.

tfrommen
fuente
3
Esta es una gran respuesta y muestra cómo puede anular los filtros. Gracias.
Shawn