Différence entre add_filter et apply_filters

17

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 quelles informations ou logique considérer avant d'utiliser add_filterou apply_filtersdans un contexte.

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

  • Est-il correct d' add_filterajouter simplement une fonction à la file d'attente de fonctions en attente d'exécution sur une variable et d' apply_filtersexécuter les fonctions dans l'ordre?

  • Est-il également exact que apply_filterslorsqu'il est appelé avec un argument (le nom de la fonction à exécuter) exécutera cette fonction avant toutes les autres (si elles existent) dans la file d'attente?

hanachi
la source
2
Qu'en est-il de la documentation existante ici et ici ne l'explique pas adéquatement pour vous?
t31os
3
Je pense que c'est en fait une bonne question. En tant que nouveau développeur wordpress, cela peut être un concept déroutant.
Shawn du

Réponses:

26

La plupart des éléments suivants se trouvent dans le Codex :


apply_filters

Les fonctions de rappel attachées au hook de filtre $tagsont 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, ... );

Essentiellement:
vous utilisez apply_filterspour filtrer une donnée $value- en ce qui concerne la valeur elle-même ainsi que les variables éventuellement fournies $var_1via $var_n.


add_filter

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

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

Essentiellement:
vous utilisez add_filterpour accrocher une fonction personnalisée à l'action de filtrage donnée ( $tag), que vous avez peut-être générée apply_filtersavant (ou c'était une action de filtrage intégrée ou découle d'un plugin / de votre thème).


Voici donc un exemple fictif :

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 simplement 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 obtenons les initiales dans l'ordre inverse, car la fonction de filtrage __return_true, qui est liée à notre action de filtrage, revient toujours TRUEet fait donc sortir les initiales de droite à gauche.

tfrommen
la source
3
Ceci est une excellente réponse et montre comment vous pouvez remplacer les filtres. Merci.
Shawn