add_submenu_page no funciona
He creado un plugin que crea un menú personalizado de esta manera:
add_menu_page( 'Precios Mayoristas', 'Mayorista', 'manage_options', 'woo-wholesale', 'woo_wholesale_page_call');
Ahora estoy intentando añadir un elemento de submenú debajo de este. He leído el codex y he llegado a esto:
add_submenu_page( 'woo-wholesale', 'Registros', 'Registros', 'manage_options', 'woo-wholesale-registrations', 'wwpr_page_call' );
Supongo que esto es incorrecto ya que el elemento del submenú no se está mostrando. ¿Alguien puede arrojar algo de luz sobre esto por favor?

Asegúrate de que tu hook add_action
esté configurado como admin_menu.
Aquí tienes un código de ejemplo:
add_action('admin_menu', 'wpse149688');
function wpse149688(){
add_menu_page( 'Precios al por mayor', 'Al por mayor', 'manage_options', 'woo-wholesale', 'woo_wholesale_page_call');
add_submenu_page( 'woo-wholesale', 'Registros', 'Registros', 'manage_options', 'woo-wholesale-registrations', 'wwpr_page_call' );
}
También verifica si el usuario con el que has iniciado sesión tiene la capacidad de ver este menú. Ya que este menú está configurado usando la capacidad manage_options
.

Cometí el mismo error que el OP, ya que no es intuitivo cómo hacer que esto funcione. Al leer el codex sobre Menús de Administración, descubrí la respuesta.
El problema (para mí, de todos modos) fue editar el parámetro $parent_slug
en la llamada a add_submenu_page(...)
.
Entonces, en el caso del OP, deberías cambiar:
add_submenu_page(
'woo-wholesale',
'Registrations',
'Registrations',
'manage_options',
'woo-wholesale-registrations',
'wwpr_page_call'
);
por:
add_submenu_page(
'edit.php?post_type=woo-wholesale',
'Registrations',
'Registrations',
'manage_options',
'woo-wholesale-registrations',
'wwpr_page_call'
);

Tu código es correcto. Sin embargo, hay algo que falta y que no es obvio en absoluto, y quien llegue a esta pregunta en el futuro debería leer esto:
Cuando una página de menú tiene 0 o 1 páginas de submenú, no se mostrarán submenús.
Una página de menú contiene una página por sí misma.
Una página de menú que contiene 1 página de submenú, aparecerá igual que si no tuviera una página de submenú. Esto se debe a que el elemento de menú de primer nivel y el primer elemento de menú de segundo nivel perteneciente a ese menú de primer nivel están destinados a mostrar la misma página.
En otras palabras, no puedes tener un solo elemento de submenú, porque eso no parece tener sentido para WordPress.
"¿Solo una página? ¡Entonces usa el elemento del menú directamente! No hay necesidad de un desplegable."
Ten en cuenta que cada vez que haces clic en un elemento del menú que se encuentra en la interfaz de administración y que tiene subelementos, cargará su primer subelemento. Por lo tanto, el elemento del menú y su primer subelemento son esencialmente lo mismo. Sin embargo, puedes renombrar el subelemento.
Algunos ejemplos de esto:
- Escritorio = Inicio
- Entradas = Todas las entradas
- Apariencia = Temas
- Herramientas = Herramientas disponibles
Entonces, en tu caso, hacer clic en Precios al por mayor cargaría Registros.
Cuando una página de menú contiene 2 o más páginas de submenú, las páginas de submenú se harán visibles. Eso es lo que la mayoría de nosotros no sabemos al principio.
Así que el truco es crear una página de submenú idéntica a la página del menú (puedes cambiar el $page_title y $menu_title si lo deseas) y luego tu página de submenú adicional:
add_menu_page( '', 'Elemento del menú', $capability, 'parent_slug', $callback );
add_submenu_page( 'parent_slug', 'Título de la página', 'Primer subelemento', $capability, 'parent_slug', $callback );
add_submenu_page( 'parent_slug', 'Segundo título de página', 'Segundo subelemento', $capability, 'submenu_slug', $submenu_callback );
Como puedes ver, el $page_title
para add_menu_page
incluso podría dejarse como una cadena vacía (pero no null
), porque el título utilizado para la página será el $page_title
del primer submenú. Pero recomiendo introducir la misma cadena para ambos para una mejor legibilidad.
Ahora apliquemos esto a tu código:
add_menu_page( 'Precios al por mayor', 'Al por mayor', 'manage_options', 'woo-wholesale', 'woo_wholesale_page_call');
add_submenu_page( 'woo-wholesale', 'Precios al por mayor', 'Precios', 'manage_options', 'woo-wholesale', 'woo_wholesale_page_call' );
add_submenu_page( 'woo-wholesale', 'Registros', 'Registros', 'manage_options', 'woo-wholesale-registrations', 'wwpr_page_call' );
Y tendrás la siguiente estructura de menú:
Al por mayor
-- Precios
-- Registros
Donde hacer clic en Al por mayor o Precios te llevará a la misma página.
