如何将变量传递给add_settings_section()回调?
-
22-10-2019 - |
题
我正在尝试尽可能多地自动化设置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
回调的变量,作为函数调用中的第五个参数:
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
}
}
}
}
解决方案
如果你看 do_settings_sections 功能更具体地是执行回调函数的第1164行:
call_user_func($section['callback'], $section);
您可以看到$部分数组正在传递给回调函数,因此您可以通过 $section['id']
希望这能做到。
更新
这是一个示例,如果您的ADD_SETTINGS_SETER_SETER回调为所有部分均命名 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
}
}
通过做一些事情,我的意思是要做您想做的任何事情。
其他提示
我知道这是一个古老的问题,但我会把我的两分钱扔进去,以防万一其他人出现。这样做的一种更简单的方法是编写您自己的修改 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' );
}
现在,您只需使用它而不是本机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 );
}
否则回调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所述,Paramater,这意味着我们添加到的整个数组 $wp_settings_sections
在 my_add_settings_section()
被传递到我们的回调中,这意味着我们可以访问每个新数组成员,例如 callbackargs
允许我们的功能具有完整的回调。
即使我确定这可能很明显,我认为我只是解释了这一点,以防万一有人感到困惑。
您也可以始终使用更通用的方法,而不是寻找特定函数实现(含义,而无需检查add_settings_section是否隐含地传递任何内容)。这种通用方法使用PHP闭合。
如何使用它:在每个地方,您传递函数名称,而不是通过匿名函数, 利用 在里面。
例子:
代替
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 );
}