Как добавить секцию (add_settings_section) на кастомную страницу (add_submenu_page) в WordPress
У меня есть страница плагина, созданная с помощью add_submenu_page
, я хочу добавить туда новую секцию, но ничего не происходит:
add_submenu_page('parent', 'Foo', 'Foo', 'manage_options', 'foo-settings', 'anothercallback');
add_settings_section('foo-settings-section', 'Настройки', 'acallback', 'foo-settings');
Как правильно вызвать эту функцию для кастомной страницы? Есть ли полный рабочий пример?

Функция add_settings_section()
просто регистрирует раздел формы с определённым слагом в WordPress. Чтобы отобразить этот раздел и все добавленные в него поля на определённой странице меню, вам необходимо включить метод do_settings_sections($sections-slug)
в колбэк меню. Это, конечно, предполагает использование Settings API, частью которого является add_settings_section
.
Пример:
function plugin_admin_init() {
// Все колбэки должны быть валидными именами функций, даже если предоставленные функции пусты
register_setting( 'option_group', 'option_name', 'sanitize_callback' );
add_settings_section( 'section_id', 'section_title', 'section_callback', 'section_page_type' );
add_settings_field( 'field_id', 'field_title', 'field_callback', 'section_page_type', 'section_id' );
}
add_action( 'admin_init', 'plugin_admin_init' );
function add_menus() {
add_menu_page( 'menu_page_title', 'menu_title', 'menu_capability', 'menu_slug', 'menu_callback');
add_submenu_page( 'menu_slug', 'submenu_page_title', 'submenu_title', 'submenu_capability', 'submenu_slug', 'submenu_callback' );
}
add_action( 'admin_menu', 'add_menus' );
function submenu_callback() {
?>
<div class='wrap'>
<h2>Настройки</h2>
<form method='post' action='options.php'>
<?php
/* 'option_group' должен соответствовать 'option_group' из вызова register_setting */
settings_fields( 'option_group' );
do_settings_sections( 'section_page_type' );
?>
<p class='submit'>
<input name='submit' type='submit' id='submit' class='button-primary' value='<?php _e("Сохранить изменения") ?>' />
</p>
</form>
</div>
<?php
}
Я постарался сделать все названия параметров уникальными, чтобы вы могли их различить и отследить, куда они передаются. Settings API очень строг в том, что должно быть передано и куда, поэтому убедитесь, что всё сделано правильно. Также учтите, что в этом примере я опустил все функции колбэков, но в реальности они необходимы.

Единственная ситуация, когда do_settings_sections($sections_slug) не требуется для отображения секций, ранее добавленных на страницу подменю, — это когда вы добавляете свои секции на уже существующую страницу подменю, такую как страницы в меню Настройки (общие, написание, чтение, обсуждение, медиафайлы, постоянные ссылки).

Это ваша проблема, в вашем коллбэке add_submenu_page()
:
settings_fields( 'option_group' );
do_settings_section( 'section_page_type' );
Для settings_fields()
:
- Вам нужно использовать параметр
$optiongroup
, который вы передали вregister_setting()
.
Для do_settings_sections()
:
- Функция называется
do_settings_sections()
, а неdo_settings_section()
(обратите внимание на множественное число) - Вам нужно передать параметр
$pageid
, который вы передали вadd_submenu_page()
.
РЕДАКТИРОВАНИЕ
Эх, неважно. Я отвечал на чужой ответ, который ошибочно принял за разметку реального коллбэк-функции. Приведенные здесь ответы могут быть применимы или нет; нам все еще нужно увидеть полный код, включая коллбэки.
