web-dev-qa-db-ja.com

Add_settings_fieldのコールバック関数名として変数を利用する方法

私のテーマオプション機能に含まれるコードの量を削減しようとしています。私は自分の設定を次のように追加しています。add_settings_field($ k、$ v、$ callback、$ 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;

}

私を裸にしなさい。誰かが以前にこの問題に直面していたことを願っていて、明白なことが欠けていることを私に知らせてくれるでしょう。以下は私のワードプレス環境内でも同じループの外で機能します。

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

}

ハードコーディングすることなく、ループ内でコールバック関数を呼び出せるような方法で一連のオプションをループ処理するための解決策を説明できる人はいますか。これはクラスを使って解決できるものでしょうか。頭を絞ることはできません。

2
Starfs

別のコールバックを使用しないでください。代わりにadd_settings_field()に6番目のパラメーターを使用してください。これは配列なので、ここでコールバックに任意のデータを渡すことができます。

例:

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