Я пытаюсь максимально автоматизировать вызовы функций 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
}
}
}
}
источник
extract( $args, EXTR_SKIP );
в началеoenology_hooks_setting_callback()
, так что вам не нужно сохранять каждую часть массива в новую$var
? Они будут доступны$'name_inside_the_array
, например, с. '$ title,
$ tab` и т. д.Ответы:
если вы посмотрите на функцию do_settings_sections более конкретно на строку 1164, где выполняется функция обратного вызова:
вы можете видеть, что массив $ section передается в функцию обратного вызова, поэтому вы можете определить обратный вызов по
$section['id']
надеюсь, что это сделать с тех пор.
Обновить
Вот пример, если ваш обратный вызов add_settings_section для всех разделов был назван,
oenology_hooks_section_callback
вы можете определить его следующим образом:и делать вещи, я имею в виду делать все, что вы хотите сделать с этим обратным вызовом раздела.
источник
$section['id']
?id
будет первым аргументом, который вы передадитеadd_settings_section()
Я знаю, что это старый вопрос, но я добавлю свои два цента, на случай, если кто-то еще придет; более простой способ сделать это - написать собственную модификацию
add_settings_section()
функции, которая добавит только параметр args обратного вызова в его конец.Это будет выглядеть так (или что-то вроде этого)
Теперь вы просто использовали бы это вместо встроенной функции wordpress и получили бы доступ к своим аргументам обратного вызова через
'callbackargs'
клавишу массива обычным способом, как этоКоторый мы могли бы использовать, чтобы перейти к какой-то другой функции:
Или аргументы обратного вызова могут быть самим массивом, который мы используем:
Это все возможно, потому что все, что
add_settings_section()
нужно, это добавить новый элемент массива в$wp_settings_sections
глобальную переменную, этот новый элемент массива может быть самим массивом, содержащим любое количество ключей с разными именами, которые могут быть использованы любой функцией, которая знала, что они там находятся. Когдаdo_settings_sections
называютcall_user_func_array
это проходит В$sections
параметр , как указан Bainternet, это означает , что весь массив мы добавили$wp_settings_sections
вmy_add_settings_section()
просеивают в наш обратный вызов, то есть у нас есть доступ к каждому новому члену массива мы добавим к нему , таким какcallbackargs
позволяя нашу функция , чтобы иметь полный окрыленный обратный звонок.Несмотря на то, что я уверен, что это может быть очевидно, я подумал, что просто объясню, если кто-то, кто запутался, заглянет внутрь
источник
Вы также можете всегда использовать более общий подход, не ища конкретную реализацию функции (то есть, не проверяя, проходит ли add_settings_section что-то неявно). Этот общий подход использует закрытие PHP.
Как его использовать: в любом месте, где вы передаете имя функции, вместо нее передается анонимная функция, с использованием в ней.
Пример:
вместо того
ты можешь использовать:
источник