web-dev-qa-db-fra.com

Comment savoir quelles variables sont passées dans un filtre/action et quelle est leur signification?

Quelque chose que j'ai déjà vu à plusieurs reprises et que je ne comprends pas est le suivant: Dans le functions.php d'un thème, une fonction est définie, puis attachée à un hook, comme ceci (exemple simplifié):

function do_stuff($a, $b) {
    // Do stuff with $a and $b
}
add_filter( 'bloginfo_url', 'do_stuff', 10, 2 );

En gros, je pense comprendre ce qui se passe là-bas, mais comment savoir ce que $aet $bis?
De manière "traditionnelle" PHP, on appellerait la fonction peut-être comme ça:

do_stuff("var a content", $var_b_content);

Ensuite, il est clair ce que contiennent $aet $b, mais comment puis-je le savoir avec Wordpress?

Exemple concret, utilisez la fonction suivante (crédit de Frank Bültge ):

if ( ! function_exists( 'fb_css_cache_buster' ) ) {
        function fb_css_cache_buster( $info, $show ) {
                if ( ! isset($pieces[1]) )
                        $pieces[1] = '';
                if ( 'stylesheet_url' == $show ) {

                        // Is there already a querystring? If so, add to the end of that.
                        if ( strpos($pieces[1], '?' ) === FALSE ) {
                                return $info . "?" . filemtime( WP_CONTENT_DIR . $pieces[1] );
                        } else {
                                $morsels = explode( "?", $pieces[1] );
                                return $info . "&" . filemtime( WP_CONTENT_DIR . $morsles[1] );
                        }
                } else {
                        return $info;
                }
        }

        add_filter( 'bloginfo_url', 'fb_css_cache_buster', 9999, 2 );
}

La fonction peut être utilisée pour le contrôle de version CSS en attachant la date du dernier changement (en utilisant filemtime) comme chaîne de requête à l'appel CSS.

Vous pouvez voir que les utilisations $info et $show sont des variables transmises à cette fonction. Mais comment puis-je savoir ce que ces variables contiennent? Il utilise même ces variables dans la logique conditionnelle ('stylesheet_url' == $show) alors quelque chose doit être passé automatiquement?

2
Sven

Fondamentalement, chaque filtre doit être enregistré dans le code de fonction d'origine (puisqu'un filtre est simplement un moyen de remplacer ce qui se passe dans la fonction par défaut). Donc, avant de pouvoir associer votre fonction personnalisée à un filtre à l'aide de add_filter(), le filtre doit être préalablement enregistré avec apply_filters() (il existe d'autres fonctions qui font de même, mais c'est la plus importante).

Ainsi, dans l'exemple que vous avez donné dans la fonction d'origine , il existe un appel à apply_filters() (ligne 533):

$output = apply_filters('bloginfo_url', $output, $show);

Comme vous pouvez le constater, les deux paramètres du contexte de fonction d'origine sont $output et $show.

Pour résumer, le meilleur moyen de connaître les paramètres d’un filtre est le suivant:

  • Recherchez la documentation des paramètres dans le codex (bien que tous les filtres n'y soient pas complètement documentés).
  • Examinez le code source de la fonction d'origine pour voir quels paramètres sont transmis au filtre.

Modifier pour répondre à votre commentaire

Parce que $ info est juste un autre nom pour $ output?

Tu as raison. Les noms des variables peuvent changer quand elles sont passées à travers un filtre. Cela est simplement dû au fonctionnement de la déclaration d'une fonction dans PHP:

my_function($output);

function my_function($info) {
    // in the context of this function the content of $output is now inside the variable $info.
}

De plus, que se passe-t-il exactement dans le filtre nommé 'bloginfo_url'? J'ai essayé de le trouver dans le noyau, mais ce n'est pas là.

Par défaut, rien ne se passe avec bloginfo_url. WordPress Core n'attache aucune fonction à ce filtre. Il fournit simplement ce filtre pour vous, de sorte que vous pouvez modifier le comportement natif de WordPress sans avoir besoin de modifier aucun des fichiers de base. (Ce n'est que le cas pour ce filtre, certains des autres filtres sont utilisés par WordPress lui-même.)

Lorsque vous travaillez avec ces filtres, vous devez toujours garder à l'esprit le fait que d'autres (plugins ou WordPress lui-même) peuvent associer des fonctions en conflit avec des tâches que vous souhaitez réaliser avec votre fonction. Vous pouvez contrôler le moment où votre fonction sera exécutée par rapport aux autres fonctions attachées au même filtre avec le paramètre $priority.

5
s1lv3r