add_submenu_page не работает

15 июн. 2014 г., 20:41:57
Просмотры: 23.5K
Голосов: 5

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

    add_menu_page( 'Оптовые цены', 'Опт', 'manage_options', 'woo-wholesale', 'woo_wholesale_page_call'); 

Теперь я пытаюсь добавить подпункт меню под этим пунктом. Я прочитал документацию и написал:

add_submenu_page( 'woo-wholesale', 'Регистрации', 'Регистрации', 'manage_options', 'woo-wholesale-registrations', 'wwpr_page_call' ); 

Я предполагаю, что это неправильно, так как подпункт меню не отображается. Может кто-нибудь прояснить, в чем проблема?

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

использовал ли ты другой класс для файла подменю. Инициализируй его и определи в основном файле.

huykon225 huykon225
21 февр. 2017 г. 18:13:45
Все ответы на вопрос 4
0
10

Убедитесь, что ваш хук 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 возможности.

15 июн. 2014 г. 20:50:43
1

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

Проблема (по крайней мере для меня) заключалась в необходимости изменить параметр $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' 
);
28 апр. 2016 г. 16:29:05
Комментарии

Сработало для меня. Этот ответ должен быть принят. Хотя автор вопроса должен был включить строку 'add_action' для наглядности, похоже, что правильный атрибут $parent_slug был более очевидной проблемой.

Kalnode Kalnode
12 авг. 2018 г. 02:58:12
0

Ваш код правильный. Однако есть одна неочевидная деталь, которую стоит учесть, и если кто-то в будущем снова столкнётся с этим вопросом, ему следует прочитать следующее:

Когда страница меню имеет 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' );

В результате у вас будет следующая структура меню:

Опт
-- Цены
-- Регистрации

Где клик на Опт или Цены приведёт вас на одну и ту же страницу.

4 янв. 2024 г. 13:18:42
0

У меня были права manage-options вместо manage_options. Это исправило проблему.

29 авг. 2023 г. 17:03:42