我正在尝试尽可能地自动化设置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
}
}
}
}
最合适的回答,由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 );
}