add_submenu_page не работает
У меня есть плагин, который создает пользовательское меню следующим образом:
add_menu_page( 'Оптовые цены', 'Опт', 'manage_options', 'woo-wholesale', 'woo_wholesale_page_call');
Теперь я пытаюсь добавить подпункт меню под этим пунктом. Я прочитал документацию и написал:
add_submenu_page( 'woo-wholesale', 'Регистрации', 'Регистрации', 'manage_options', 'woo-wholesale-registrations', 'wwpr_page_call' );
Я предполагаю, что это неправильно, так как подпункт меню не отображается. Может кто-нибудь прояснить, в чем проблема?

Убедитесь, что ваш хук add_action
установлен на admin_menu.
Пример кода:
add_action('admin_menu', 'wpse149688');
function wpse149688(){
add_menu_page( 'Wholesale Pricing', 'Wholesale', 'manage_options', 'woo-wholesale', 'woo_wholesale_page_call');
add_submenu_page( 'woo-wholesale', 'Registrations', 'Registrations', 'manage_options', 'woo-wholesale-registrations', 'wwpr_page_call' );
}
Также проверьте, имеет ли пользователь, под которым вы вошли, право просматривать это меню. Так как это меню установлено с использованием manage_options
возможности.

Я совершил ту же ошибку, что и автор исходного сообщения, так как неочевидно, как заставить это работать. Прочитав документацию в Административных меню, я нашел ответ.
Проблема (по крайней мере для меня) заключалась в необходимости изменить параметр $parent_slug
в вызове функции add_submenu_page(...)
.
Таким образом, в случае автора сообщения нужно изменить:
add_submenu_page(
'woo-wholesale',
'Registrations',
'Registrations',
'manage_options',
'woo-wholesale-registrations',
'wwpr_page_call'
);
на:
add_submenu_page(
'edit.php?post_type=woo-wholesale',
'Registrations',
'Registrations',
'manage_options',
'woo-wholesale-registrations',
'wwpr_page_call'
);

Ваш код правильный. Однако есть одна неочевидная деталь, которую стоит учесть, и если кто-то в будущем снова столкнётся с этим вопросом, ему следует прочитать следующее:
Когда страница меню имеет 0 или 1 подменю страниц, никакие подменю отображаться не будут.
Страница меню включает в себя саму страницу.
Страница меню, содержащая 1 подменю страницу, будет выглядеть так же, как если бы у неё не было подменю. Это связано с тем, что элемент меню первого уровня и первое подменю второго уровня, принадлежащее этому меню первого уровня, должны отображать одну и ту же страницу.
Другими словами, у вас не может быть единственного элемента подменю, потому что это не имеет смысла для WordPress.
"Только одна страница? Просто используйте сам элемент меню! Нет необходимости в выпадающем списке."
Обратите внимание, что при клике на любой элемент меню в административной панели, у которого есть подпункты, будет загружен его первый подпункт. Таким образом, элемент меню и его первый подпункт по сути одинаковы. Однако вы можете переименовать подпункт.
Несколько примеров:
- Консоль = Главная
- Записи = Все записи
- Внешний вид = Темы
- Инструменты = Доступные инструменты
Таким образом, в вашем случае клик на Оптовые цены загрузит Регистрации.
Когда у страницы меню есть 2 или более подменю страниц, подменю станут видны. Это то, о чём большинство из нас не знает вначале.
Таким образом, трюк заключается в создании подменю страницы, идентичной странице меню (вы можете изменить $page_title
и $menu_title
, если хотите), а затем добавить дополнительную подменю страницу:
add_menu_page( '', 'Элемент меню', $capability, 'parent_slug', $callback );
add_submenu_page( 'parent_slug', 'Заголовок страницы', 'Первый подпункт', $capability, 'parent_slug', $callback );
add_submenu_page( 'parent_slug', 'Второй заголовок страницы', 'Второй подпункт', $capability, 'submenu_slug', $submenu_callback );
Как вы можете заметить, $page_title
для add_menu_page
можно даже оставить пустой строкой (но не null
), потому что заголовок страницы будет взят из $page_title
первого подменю. Но я рекомендую использовать одинаковые строки для обоих для лучшей читаемости.
Теперь применим это к вашему коду:
add_menu_page( 'Оптовые цены', 'Опт', 'manage_options', 'woo-wholesale', 'woo_wholesale_page_call');
add_submenu_page( 'woo-wholesale', 'Оптовые цены', 'Цены', 'manage_options', 'woo-wholesale', 'woo_wholesale_page_call' );
add_submenu_page( 'woo-wholesale', 'Регистрации', 'Регистрации', 'manage_options', 'woo-wholesale-registrations', 'wwpr_page_call' );
В результате у вас будет следующая структура меню:
Опт
-- Цены
-- Регистрации
Где клик на Опт или Цены приведёт вас на одну и ту же страницу.
