web-dev-qa-db-fra.com

Comment utiliser une variable comme nom de fonction de rappel pour add_settings_field

J'essaie de réduire la quantité de code présente dans la fonction des options de thème. J'ajoute mes paramètres comme suit: add_settings_field ($ k, $ v, $ callback, $ the_options, $ the_group, $ args);

Cela fonctionne pour moi dans tous les sens tant que j'écris le nom de la fonction. Par exemple, si $ callback = 'awesome_callback' - et je crée une fonction appelée

awesome_callback(){ echo 'something'}; 

il n'y a aucun problème que ce soit.

La boucle suivante fonctionne également et parcourt le tableau d’options pour créer les champs de paramètres .. et récupère toutes les données nécessaires. il rappelle également exactement ce que je pense que mon rappel devrait être nommé. Cependant, à l’heure actuelle, j’ai des fonctions de rappel gagillion en dehors de cette boucle qui se ressemblent toutes, à l’exception du nom de la fonction. :(

foreach($theOptions as $k=>$v) {

    add_settings_field($k,$v,$callback,$the_options,$the_group,$args);
    echo $callback;

}

Nu avec moi. J'espère que quelqu'un a déjà fait face à ce problème et qu'il me dira qu'il me manque quelque chose d'évident. Ce qui suit fonctionne également dans mon environnement wordpress en dehors de la même boucle.

$callback = 'awesome_callback';
$callback = function() {
    echo 'awesome callback';
}
$callback();

Toutefois, ce qui suit renvoie une erreur à la fonction de rappel inconnue même si, lorsque je répète la variable $ callback, elle renvoie la chaîne exacte à laquelle je fais référence dans la fonction de rappel. Je suppose que j'exagère sur la valeur de rappel ... ???

foreach($theOptions as $k=>$v) {

    $callback = $k.'_callback';
    add_settings_field($k,$v,$callback,$the_options,$the_group,$args);


    $callback = function() {
        echo 'Testing the callback !!! <br>';
    };

}

Quelqu'un peut-il expliquer une solution permettant de parcourir plusieurs options de manière à permettre d'appeler la fonction de rappel dans la boucle, sans avoir à la coder en dur? Est-ce quelque chose qui pourrait être résolu en utilisant une classe? Je ne peux pas serrer ma tête autour d'elle.

2
Starfs

N'utilisez pas de rappels différents, utilisez plutôt le sixième paramètre de add_settings_field(). C'est un tableau et vous pouvez transmettre toutes les données au rappel ici.

Exemple:

foreach( $theOptions as $k => $v ) 
{
    add_settings_field(
        $k,
        $v,
        'my_callback',
        $the_options,
        $the_group,
        array (
            'special' => $k
        )
    );
}

function my_callback( $args )
{
    var_dump( $args['special'] );

    switch ( $args['special'] )
    {
        case 'foo':
            // do something
            break;
        case 'bar':
            // do something else
            break;
        default:
            // default handler 
    }
}
3
fuxia