Добавить раздел (добавить раздел настроек) на пользовательскую страницу (добавить страницу подменю)


У меня есть страница плагина, созданная с помощью add_submenu_page, я хочу добавить туда новый раздел, но ничего не происходит:

add_submenu_page('parent', 'Foo', 'Foo', 'manage_options', 'foo-settings', 'anothercallback');
add_settings_section('foo-settings-section', 'Settings', 'acallback', 'foo-settings');

Как правильно использовать его на пользовательской странице? У вас есть полный пример?

Author: Ethan O'Sullivan, 2011-08-22

2 answers

Функция add_settings_section() просто регистрирует раздел формы с определенным слагом в WordPress. Чтобы получить раздел и все поля, которые вы добавили в него, для отображения на определенной странице меню, вам необходимо включить метод do_settings_sections($sections-slug) в обратный вызов меню. Это, конечно, при условии, что вы используете API настроек, частью которого является add_settings_section.

Пример:

function plugin_admin_init() {
     //All callbacks must be valid names of functions, even if provided functions are blank
     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>Settings</h2>
          <form method='post' action='options.php'>
          <?php 
               /* 'option_group' must match 'option_group' from register_setting call */
               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("Save Changes") ?>' />
               </p>
          </form>
     </div>
     <?php
}

Я сделал все возможное, чтобы имена всех параметров были уникальными, поэтому вы должны иметь возможность различать их и отслеживать, где они уходят. API настроек очень точно определяет, что и куда нужно делать, поэтому убедитесь, что у вас все в порядке. Кроме того, имейте в виду, что я опустил все функции обратного вызова из этого примера, но на самом деле они необходимы.

 12
Author: Chiubaka, 2014-07-26 16:44:38

Это ваша проблема, в вашем 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().

РЕДАКТИРОВАТЬ

Э-э, неважно. Я отвечал на чей-то ответ, который я неправильно истолковал как фактическую разметку функции обратного вызова. Ответы здесь могут быть применимы, а могут и не применяться; нам все равно нужно увидеть полный код, включая обратные вызовы.

 1
Author: Chip Bennett, 2011-08-23 01:46:00