web-dev-qa-db-fra.com

Problème de compréhension apply_filters ()

Dans apply_filters ()

apply_filters( $tag, $value, $var ... );

J'ai du mal à comprendre le $value et le $var. J'ai lu le codex et on dirait que le $value peut être modifié, le $var pas, mais je n'ai trouvé aucun exemple de cela à l'état sauvage. Il semble être utilisé comme un moyen de passer une variable. Dans quel cas, quelle est la différence entre cela et le $var?

19
r00tAcc3ss

Essayez de voir la fonction avec de meilleurs noms:

apply_filters(
    $filter_name,     // used for add_filter( $filter_name, 'callback' );
    $value_to_change, // the only variable whose value you can change
    $context_1,       // context
    $context_2        // more context
);

Alors, quand cette fonction s'appelle comme:

// wp-login.php line 94
apply_filters( 'login_body_class', $classes, $action );

Vous pouvez utiliser …

add_filter( 'login_body_class', 'function_to_change_login_body_class', 10, 2 );

… Et obtenir deux variables passées à cette fonction. Vous retournez le premier, le second fournit juste plus de contexte:

function function_to_change_login_body_class( $classes, $action )
{
    if ( 'login' === $action )
        $classes[] = 'foo';

    if ( 'postpass' === $action )
        $classes[] = 'bar';

    return $classes;
}

Les variables supplémentaires sont là pour faciliter vos décisions, pas pour les changer aussi.

34
fuxia

Que sont les filtres?

Les filtres sont des fonctions par lesquelles WordPress transmet des données, à certains moments de l’exécution, juste avant d’agir sur les données (par exemple, les ajouter à la base de données ou les envoyer à l’écran du navigateur). Les filtres se situent entre la base de données et le navigateur (lorsque WordPress génère des pages) et entre le navigateur et la base de données (lorsque WordPress ajoute de nouveaux messages et commentaires à la base de données); la plupart des entrées et sorties dans WordPress passent par au moins un filtre. WordPress fait un peu de filtrage par défaut, et votre plugin peut ajouter son propre filtrage.

Accrocher dans un filtre

Afin de permettre aux utilisateurs de modifier certaines données spécifiques (une valeur, la sortie d'une fonction, etc.), des crochets de filtre sont fournis via les fonctions apply_filters.
Ces crochets de filtre incluent le nom (ou balise) du filtre et au moins le nom de la fonction à utiliser pour filtre (c'est-à-dire, modifier d'une manière ou d'une autre ) les données.

Pour modifier le titre d'un message, vous pouvez utiliser le hook the_title filter, défini comme suit:

apply_filters( 'the_title', $title, $id );

Cela signifie que le filtre a le tag/nom the_title, le premier paramètre $title est la donnée à modifier (c'est-à-dire le titre de l'article) et le second paramètre $id est une information supplémentaire (dans ce cas l'identifiant de l'article).

Pour afficher le titre de chaque message dans UPPERCASE, par exemple, vous pouvez utiliser la ligne suivante:

add_filter('the_title', 'strtoupper');

Si nous regardons la fonction add_filter , nous voyons qu’elle est définie comme suit:

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

Nous avons uniquement spécifié les premier et deuxième paramètres (requis), tandis que les troisième et quatrième paramètres sont réglés sur leur valeur par défaut respective (c'est-à-dire, 10 et 1).

Un filtre plus complexe

Si vous voulez filtrer uniquement un certain post , vous pouvez utiliser les informations supplémentaires (dans le cas de ce filtre: l'ID). Pour ce faire, vous devez spécifier le nombre de paramètres (qui est 2 dans ce cas), et pour cela, vous devez spécifier le paramètre priority (qui vient avant le nombre d'arguments).

Supposons que nous ne voulions affecter que le titre de l'article avec l'ID 42, alors il se présente comme suit:

add_filter('the_title', 'my_strtoupper', 10, 2);
function my_strtoupper($title, $id) {
    if (42 === $id) return strtoupper($title);
    return $title;
} // function my_strtoupper

Dans ce cas, nous devons spécifier les quatre paramètres disponibles.

Quels paramètres ai-je?

Pour identifier le (nombre de) paramètres disponibles d'un filtre donné, vous devez rechercher où il est défini (dans ce cas: ici ).


Références :

10
tfrommen