Как добавить секцию (add_settings_section) на кастомную страницу (add_submenu_page) в WordPress

22 авг. 2011 г., 22:57:37
Просмотры: 13.8K
Голосов: 5

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

add_submenu_page('parent', 'Foo', 'Foo', 'manage_options', 'foo-settings', 'anothercallback');
add_settings_section('foo-settings-section', 'Настройки', 'acallback', 'foo-settings');

Как правильно вызвать эту функцию для кастомной страницы? Есть ли полный рабочий пример?

5
Комментарии

У вас определена функция "acallback"?

tollmanz tollmanz
22 авг. 2011 г. 23:12:56

Да, она у меня определена.

thom thom
22 авг. 2011 г. 23:30:10

Вы получаете какие-либо результаты? Например, выводится ли текст из callback-функции add_settings_section()? Как определён ваш callback для add_submenu_page()? Можно увидеть этот код?

Chip Bennett Chip Bennett
22 авг. 2011 г. 23:42:20

На самом деле я использовал встроенное определение функции (param, function () { echo 'here'; }, param); Я использую PHP 5.3. Спасибо

thom thom
22 авг. 2011 г. 23:45:49

Можете опубликовать весь соответствующий код? В противном случае будет очень сложно определить, в чем проблема.

Chip Bennett Chip Bennett
23 авг. 2011 г. 02:04:05
Все ответы на вопрос 2
4
13

Функция 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 очень строг в том, что должно быть передано и куда, поэтому убедитесь, что всё сделано правильно. Также учтите, что в этом примере я опустил все функции колбэков, но в реальности они необходимы.

22 авг. 2011 г. 23:56:26
Комментарии

У меня тоже есть такой вызов :(

thom thom
23 авг. 2011 г. 00:16:31

@thom Ок, вот полный пример, обобщенный из моего рабочего кода.

Chiubaka Chiubaka
23 авг. 2011 г. 02:09:53

Спасибо. Проблема была с параметром do_settings_section.

thom thom
23 авг. 2011 г. 14:16:02

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

aldemarcalazans aldemarcalazans
11 апр. 2019 г. 03:41:10
0

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

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

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

23 авг. 2011 г. 04:46:00