変数をadd_settings_section()コールバックに渡す方法は?


16

プラグインの各設定に対して、設定API関数呼び出しを可能な限り自動化しようとしています。オプション配列をループし、出力しadd_settings_section()add_settings_field()十分に簡単です:

add_settings_section()

$oenology_hooks_tabs = oenology_hooks_get_settings_page_tabs();
foreach ( $oenology_hooks_tabs as $tab ) {
    $tabname = $tab['name'];
    $tabtitle = $tab['title'];
    $tabsections = $tab['sections'];
    foreach ( $tabsections as $section ) {
        $sectionname = $section['name'];
        $sectiontitle = $section['title'];
        $sectiondescription = $section['description'];
        // Add settings section
        add_settings_section(
            'oenology_hooks_' . $sectionname . '_section',
            $sectiontitle,
            'oenology_hooks_' . $sectionname . '_text',
            'oenology_hooks_' . $tabname . '_tab'
        );
    }
}

そして、 `add_settings_field():

global $oenology_hooks;
$oenology_hooks = oenology_hooks_get_hooks();

foreach ( $oenology_hooks as $hook ) {
    $hookname = $hook['name'];
    $hooktitle = $hook['title'];
    $hooktab = $hook['tab'];
    $hooksection = $hook['section'];
    add_settings_field(
        'oenology_hooks_' . $hookname,
        $hooktitle,
        'oenology_hooks_setting_callback',
        'oenology_hooks_' . $hooktab . '_tab',
        'oenology_hooks_' . $hooksection . '_section',
        $hook
    );
}

add_settings_field()、一般的なコールバックを簡単に書くことができます。$hookすると、関数呼び出しの5番目のパラメーターとして変数をコールバックにます。

function oenology_hooks_setting_callback( $hook ) {
    $oenology_hooks_options = get_option( 'plugin_oenology_hooks_settings' ); 
    $hookname = $hook['name'];
    $hooktitle = $hook['title'];
    $hookdescription = $hook['description'];
    $hooktype = $hook['type'];
    $hooktab = $hook['tab'];
    $hooksection = $hook['section'];
    $inputvalue = $hookname . '_hide';
    $inputname = 'plugin_oenology_hooks_settings[' . $inputvalue . ']';
    $textareaname = 'plugin_oenology_hooks_settings[' . $hookname . ']';
    $textareavalue = $oenology_hooks_options[$hookname];
    if ( 'Filter' == $hooktype ) {
        ?>
        <input type="checkbox" name="<?php echo $inputname; ?>" value="<?php echo $inputvalue;?>" <?php checked( true == $oenology_hooks_options[$inputvalue]  ); ?> />
        <span>Hide <?php echo $hooktitle; ?> content?</span><br />
        <?php
    }
    ?>
    <span class="description"><?php echo $hooktype; ?> Hook: <?php echo $hookdescription; ?></span><br />
    <textarea name="<?php echo $textareaname; ?>" cols="80" rows="3" ><?php 
        echo esc_textarea( $textareavalue ); 
    ?></textarea>
    <?php 
}

ただし、add_settings_section()類似するものがないようです$argsパラメーターです。したがって、同じメソッドを使用して$section変数をコールバックに渡すことはできません。

したがって、私の質問:変数を変数に渡す方法はありますか add_settings_section()コールバック、または私がやっていることに類似したコールバックを作成する他の方法はありますadd_settings_field()か?

編集:

@Bainternetが釘付けにした!私の作業コードは次のとおりです。

/**
 * Callback for add_settings_section()
 * 
 * Generic callback to output the section text
 * for each Plugin settings section. 
 * 
 * @param   array   $section_passed Array passed from add_settings_section()
 */
function oenology_hooks_sections_callback( $section_passed ) {
    global $oenology_hooks_tabs;
    $oenology_hooks_tabs = oenology_hooks_get_settings_page_tabs();
    foreach ( $oenology_hooks_tabs as $tab ) {
        $tabname = $tab['name'];
        $tabsections = $tab['sections'];
        foreach ( $tabsections as $section ) {
            $sectionname = $section['name'];
            $sectiondescription = $section['description'];
            $section_callback_id = 'oenology_hooks_' . $sectionname . '_section';
            if ( $section_callback_id == $section_passed['id'] ) {
                ?>
                <p><?php echo $sectiondescription; ?></p>
                <?php
            }
        }
    }
}

1
ちょっとした注意:extract( $args, EXTR_SKIP );の始めにoenology_hooks_setting_callback()、配列のすべての部分を新しいものに保存する必要がないのはなぜ$varですか?これらは、$'name_inside_the_arrayexで使用可能になります。「$タイトル, などの$ tab`、
カイザー

...私は実際にはPHPでそれほど賢くないので?:)それを試してみます。ありがとう!
チップベネット

このGistを見てみたいと思うかもしれません。フィルタとフックを追加し、引数を解析し、クエリ文字列入力を処理する方法に関する「ベストプラクティス」の例を示しています。それは少し古く、時間があるときにやり直しますが、それは一見の価値があります。:)
kaiser

これは実際には、Oenologyに追加したフック用のUIを追加する単なるプラグインです。テーマに実際にフックを追加した方法にはかなり満足しています。今、私はそれらをエンドユーザーに公開する便利な方法を提供しようとしています。
チップベネット

私はあなたを誤解していません。あなたに何らかの助けが(いつでも)あるかもしれない場合に備えて、私はあなたにこれを見せたかっただけです。私はこのコードを皮肉なものと考えています
...-kaiser

回答:


18

do_settings_sections関数、より具体的にはコールバック関数が実行されている行1164 を見ると:

call_user_func($section['callback'], $section);

$ section配列がコールバック関数に渡されていることがわかります。そのため、 $section['id']

以来、このメイクを願っています。

更新

以下に例を示します。すべてのセクションのadd_settings_sectionコールバックに名前が付けられているoenology_hooks_section_callback場合、次のように識別できます。

function oenology_hooks_section_callback($section_passed){
    if ($section_passed['id'] == 'whatever_section_id'){
        //do stuff
    }
    if ($section_passed['id'] == 'whatever_section_id_number2'){
        //do other stuff
    }
 }

そして、何かをするということは、そのセクションコールバックでやりたいことを何でもするということです。


うーん...それは有望に見えます。どうすれば判断でき$section['id']ますか?
チップベネット

@Chip Bennett idが最初の引数になりますadd_settings_section()
-Rarst

@Chip Bennettより良い説明を試みるために例を追加しました。
Bainternet

@Bainternet:素晴らしい!私はオプションスクリプトを持っていますが、Chip Bennettと同じ問題に遭遇しました。今ではそれは魅力のように機能します。ありがとう。
アントラン

さて、週末にようやくクリックしました。私が念頭に置いているコードを試してみましょう、私は報告します。
チップベネット

4

これは古い質問ですが、他の誰かが来た場合に備えて、2セントを投入します。より簡単な方法は、add_settings_section()関数の最後にコールバックargsパラメーターのみを追加する関数の独自の変更を記述することです。

これは次のようになります(またはそれに似たもの)

function my_add_settings_section($id, $title, $callback, $page, $callbackargs) {

global $wp_settings_sections;

if ( !isset($wp_settings_sections) ) 
{
    $wp_settings_sections = array();
}

if ( !isset($wp_settings_sections[$page]) )
{
    $wp_settings_sections[$page] = array();
}

if ( !isset($wp_settings_sections[$page][$id]) )
{
    $wp_settings_sections[$page][$id] = array();
}

$wp_settings_sections[$page][$id] = array( 'id' => $id, 'title' => $title, 'callback' => $callback, 'callbackargs' => $callbackargs, 'page' => 'page' );
}

ここで、ネイティブのワードプレス関数の代わりにこれを使用し、コールバック引数にアクセスします 'callbackargs'、次のように通常の方法で配列キーを

function oenology_hooks_sections_callback( $section_passed ) {
   // Our callback arguments  
   $section_passed['callbackargs']
}

他の関数に渡すために使用できます:

 function oenology_hooks_sections_callback( $section_passed ) {
   // Our callback arguments  
   $args = $section_passed['callbackargs'];
   some_other_function( $args );
}

または、コールバック引数は、使用する配列自体にすることもできます。

function oenology_hooks_sections_callback( $section_passed ) {
   // Our callback arguments  
   if ( $section_passed['callbackargs']['stuff'] !== 'things' ) 
   {
       echo 'stuff is not things!";
   }
}

これはすべて可能です。なぜなら、すべてadd_settings_section()が新しい配列メンバーを$wp_settings_sectionsグローバル変数に追加するからです。その新しい配列メンバーは、異なる名前の任意の数のキーを含む配列自体である可能性があります。Bainternetが述べたdo_settings_sectionsように、call_user_func_arrayそれが$sectionsパラメータを呼び出すとき、これは、追加し$wp_settings_sectionsた配列全体がmy_add_settings_section()コールバックに渡されることを意味します。つまりcallbackargs、関数にフルを許可するなど、追加するすべての新しい配列メンバーにアクセスできます本格的なコールバック。

これが明らかであると確信していても、混乱した人が覗き込んだ場合に備えて説明したいと思いました。


0

また、特定の関数の実装を探すのではなく、より一般的なアプローチを常に使用することもできます(つまり、add_settings_sectionが暗黙的に何かを渡すかどうかをチェックせずに)。この一般的なアプローチでは、PHPクロージャーを使用します。

使用方法:匿名の関数を渡す代わりに、関数名を渡すすべての場所で、useそれインチ

例:

の代わりに

foreach ( $ar as $name => value ) {
    add_settings_section(
        $section,
        'something',
        'something-else',
        'callback_name'
    );
}

function callback_name() {
    do_something();
}

次を使用できます:

foreach ( $ar as $name => value ) {
    add_settings_section(
        $section,
        'something',
        'something-else',
        function () use ( $name, $value ) {
            callback_name( $name, $value )
        }
    );
}

function callback_name( $name, $value ) {
    do_something( $name, $value );
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.