Diferencia entre add_filter y apply_filters

14

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

¿Alguien puede decirme qué información o lógica debo considerar antes de usar add_filter o apply_filters en un contexto?

¿Eso hace que el uso de un imperativo y no del otro?

  • ¿Es correcto que add_filter simplemente agregue 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 invoque 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?

pregunta hanachi 30.01.2014 - 11:52

1 respuesta

23

La mayoría de los siguientes se pueden encontrar en el Codex :

apply_filters
  

Las funciones de devolución de llamada asociadas al filtro gancho $tag se 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:
Utiliza apply_filters para filtrar un $value dado, con respecto al valor en sí, así como a las variables proporcionadas opcionalmente de $var_1 a $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:
Utiliza add_filter para enganchar una función personalizada a la acción de filtro dada ( $tag ), que podría haber generado antes por apply_filters (o fue una acción de filtro integrada o se deriva de un complemento / su tema) .

Entonces, aquí hay un ejemplo de 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 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 devuelve TRUE y, por lo tanto, las iniciales se envían de derecha a izquierda.

    
respondido por el tfrommen 30.01.2014 - 12:03

Lea otras preguntas en las etiquetas