如何将变量传递给ADD_SETTINGS_SECTION()回调?

时间:2011-06-03 作者:Chip Bennett

我正在尝试尽可能地自动化设置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\\u settings\\u 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 回调的变量,作为函数调用中的第五个参数:

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 回调的变量。

Thus, my question: is there any way to pass a variable to the add_settings_section() callback, or some other way to create a callback analogous to what I\'m doing for add_settings_field()?

编辑:

@班纳特搞定了!这是我的工作代码:

/**
 * 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
            }
        }
    }
}

3 个回复
最合适的回答,由SO网友:Bainternet 整理而成

如果你看看do_settings_sections 函数,更具体地说是执行回调函数的第1164行:

call_user_func($section[\'callback\'], $section);
您可以看到$section数组正在传递给回调函数,因此您可以通过$section[\'id\']

希望这能让你自食其力。

更新以下是一个示例,如果所有节的add\\u settings\\u节回调都已命名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
    }
 }
我所说的“做事情”是指对该节回调做任何你想做的事情。

SO网友:Cikica

我知道这是一个老生常谈的问题,但我会把我的两分钱投进去,以防万一有人来;一种更简单的方法是自己修改add_settings_section() 函数,该函数只会在其末尾添加回调参数。

这看起来像这样(或类似的东西)

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\' );
}
现在,您只需使用此函数而不是本机wordpress函数,并通过\'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 全局变量,该新数组成员可以是一个数组本身,它包含任意数量的具有不同名称的键,任何知道它们存在的函数都可以使用这些键。什么时候do_settings_sections 调用call_user_func_array 它通过了$sections 正如Bainternet所指出的,这意味着我们添加到的整个数组$wp_settings_sections 在里面my_add_settings_section() 传递到回调中,这意味着我们可以访问添加到其中的每个新数组成员,例如callbackargs 允许我们的函数有一个完整的回调。

尽管我确信这可能是显而易见的,但我想我还是解释一下,以防有人感到困惑时会进来。

SO网友:Olga Farber

您也可以始终使用更通用的方法,不寻找特定的函数实现(也就是说,不检查add\\u settings\\u节是否隐式传递了任何内容)。这种通用方法使用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 );
}

结束

相关推荐

Paypal API and Wordpress

大家好,有人知道我在哪里可以找到贝宝API教程,可以帮助我找到正确的方向,我需要的是,当贝宝验证付款时,它会跳转通过一些代码来更新\\u user\\u meta,以及wp数据库中自定义表中的一些字段。我可以通过谷歌找到的信息在我所需要的方面相当模糊。regardsMartin