Différence entre add_filter et apply_filters

14

J'ai cherché une explication appropriée de la différence entre add_filter() et apply_filters() ici, mais je n’en ai pas trouvé.

Quelqu'un peut-il me dire quelle information ou quelle logique prendre en compte avant d'utiliser add_filter ou apply_filters dans un seul contexte?

Cela rend l’utilisation d’un impératif et non de l’autre?

  • Est-il exact que add_filter ajoute simplement une fonction à la file d'attente des fonctions en attente d'exécution sur une variable et que apply_filters exécute les fonctions dans l'ordre?

  • Est-il également correct que apply_filters , lorsqu'il est appelé avec un argument (le nom de la fonction à exécuter), exécutera cette fonction avant tous les autres (s'ils existent) de la file d'attente?

posée hanachi 30.01.2014 - 11:52

1 réponse

23

La plupart des éléments suivants peuvent être trouvés dans le Codex :

apply_filters
  

Les fonctions de rappel attachées au filtre crochet $tag sont appelées en appelant cette fonction. Cette fonction peut être utilisée pour créer un nouveau hook de filtre en appelant simplement cette fonction avec le nom du nouveau hook spécifié à l'aide du paramètre $ tag.

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

En substance:
Vous utilisez apply_filters pour filtrer un $value donné - en ce qui concerne la valeur elle-même, ainsi que les variables facultatives $var_1 à $var_n .

add_filter
  

Lier une fonction à une action de filtrage spécifique.

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

En substance:
Vous utilisez add_filter pour associer une fonction personnalisée à l'action de filtrage donnée ( $tag ), que vous avez peut-être déjà générée auparavant par apply_filters (ou il s'agissait d'une action de filtrage intégrée ou bien d'un plugin / de votre thème). .

Voici donc un exemple fictionnel :
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

Maintenant, si nous appelons notre fonction telle quelle, les initiales sont imprimées de gauche à droite, car c'est ce que nous avons défini comme comportement par défaut.

La deuxième fois, nous recevons les initiales dans l'ordre inverse, car la fonction de filtrage __return_true , qui est reliée à notre action de filtrage, renvoie toujours TRUE et fait en sorte que les initiales soient affichées de droite à gauche.

    
réponse donnée tfrommen 30.01.2014 - 12:03

Lire d'autres questions sur les étiquettes