Как можно использовать переменную в качестве имени функции обратного вызова для поля "Добавить настройки"


Я пытаюсь сократить объем кода, который содержится в моей функции параметров темы. Я добавляю свои настройки следующим образом: add_settings_field ($k,$v,$обратный вызов,$the_options,$the_group,$args);

Это работает для меня во всех отношениях, пока я записываю имя функции. Например, если $callback = 'awesome_callback' - и я создаю функцию с именем

awesome_callback(){ echo 'something'}; 

Никаких проблем вообще нет.

Следующий цикл также работает и проходит через массив опций для создания полей настроек.. и захватывает все необходимые данные. это также в точности повторяет то, что, по моему мнению, следует назвать моим обратным вызовом. Однако прямо сейчас у меня есть миллион функций обратного вызова вне этого цикла, которые все выглядят совершенно одинаково, за исключением имени функции. :(

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

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

}

Обнажись со мной. Я надеюсь, что кто-то сталкивался с этой проблемой раньше и даст мне знать, что я упускаю что-то очевидное. Следующее также работает в моей среде wordpress за пределами тот же цикл.

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

Однако следующее возвращает ошибку неизвестной функции обратного вызова, хотя, когда я повторяю переменную $callback, она повторяет точную строку, на которую я ссылаюсь в функции обратного вызова. Я предполагаю, что я превышаю значение обратного вызова...???

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>';
    };

}

Может ли кто-нибудь объяснить решение для циклического перебора множества параметров таким образом, чтобы можно было вызывать функцию обратного вызова в цикле без необходимости ее жесткого кодирования? Это что-то такое, что может быть решена с помощью класса? Я не могу втиснуть в это голову.

Author: Starfs, 2013-03-29

1 answers

Не используйте разные обратные вызовы, вместо этого используйте шестой параметр для add_settings_field(). Это массив, и вы можете передать любые данные в обратный вызов здесь.

Пример:

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
Author: fuxia, 2013-03-29 22:28:35