Añadir sección (add_settings_section) a una página personalizada (add_submenu_page)
Tengo una página de plugin creada con add_submenu_page
, quiero añadir una nueva sección ahí pero no ocurre nada:
add_submenu_page('parent', 'Foo', 'Foo', 'manage_options', 'foo-settings', 'anothercallback');
add_settings_section('foo-settings-section', 'Configuración', 'acallback', 'foo-settings');
¿Cuál es la llamada correcta para usarlo en una página personalizada? ¿Tienes un ejemplo completo?

La función add_settings_section()
simplemente registra una sección de formulario con un slug específico en WordPress. Para que la sección y todos los campos que hayas añadido a ella se muestren en una página de menú específica, necesitas incluir el método do_settings_sections($sections-slug)
en el callback del menú. Esto, por supuesto, asumiendo que estás utilizando la API de Ajustes, de la cual add_settings_section
forma parte.
Ejemplo:
function plugin_admin_init() {
// Todos los callbacks deben ser nombres válidos de funciones, incluso si las funciones proporcionadas están vacías
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>Ajustes</h2>
<form method='post' action='options.php'>
<?php
/* 'option_group' debe coincidir con 'option_group' de la llamada 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("Guardar cambios") ?>' />
</p>
</form>
</div>
<?php
}
Hice mi mejor esfuerzo para mantener todos los nombres de parámetros únicos, así que deberías poder distinguirlos y rastrear dónde van. La API de Ajustes es muy específica sobre lo que debe ir dónde, así que asegúrate de tener todo correcto. Además, ten en cuenta que omití todas las funciones de callback en este ejemplo, pero en realidad son necesarias.

@thom Ok, aquí tienes un ejemplo completo generalizado de un código funcional que tengo.

La única situación donde do_settings_sections($sections_slug) no es necesario, para mostrar secciones previamente añadidas a una página de submenú, es cuando añades tus secciones a una página de submenú preexistente, como las que están en el menú de Configuración (general, escritura, lectura, discusión, medios, enlaces permanentes).

Este es tu problema, en tu callback de add_submenu_page()
:
settings_fields( 'option_group' );
do_settings_section( 'section_page_type' );
Para settings_fields()
:
- Necesitas usar el parámetro
$optiongroup
que pasaste aregister_setting()
.
Para do_settings_sections()
:
- La función es
do_settings_sections()
, nodo_settings_section()
(nota el plural) - Necesitas pasar el parámetro
$pageid
que pasaste aadd_submenu_page()
.
EDITAR
Eh, olvídalo. Estaba respondiendo a la respuesta de otra persona, que leí mal como si fuera el marcado real de la función callback. Las respuestas aquí pueden o no aplicar; todavía necesitamos ver el código completo, incluyendo los callbacks.
