Вопрос или проблема
У меня есть два плагина – один из них “основной” плагин под названием “SmartPost”, и я пытаюсь расширить его другим плагином под названием “SmartPost E-mails”. Иными словами, “SmartPost E-mails” расширяет и зависит от “SmartPost”, чтобы существовать и загружаться перед загрузкой плагина электронной почты.
Внутри плагина SmartPost у меня есть следующие функции для создания административного меню:
class sp_admin{
add_action( 'admin_menu', array('sp_admin', 'sp_admin_add_template_page') );
add_action( 'admin_menu', array('sp_admin', 'sp_admin_add_category_page') );
function sp_admin_add_template_page() {
add_menu_page( SP_PLUGIN_NAME, SP_PLUGIN_NAME, 'edit_dashboard', 'smartpost', array('sp_admin', 'sp_template_page'), null, null );
}
function sp_admin_add_category_page(){
add_submenu_page( 'smartpost', 'Настройки', 'Настройки', 'edit_dashboard', 'sp-cat-page', array('sp_admin', 'sp_settings_page') );
}
}
В моем плагине “SmartPost E-mails” я хочу добавить подменю на страницу плагина SmartPost, поэтому у меня есть следующий код:
class SP_Email_Admin_Page{
function __construct(){
add_action( 'admin_menu', array($this, 'sp_add_email_admin_page') );
}
function sp_add_email_admin_page(){
if( ( is_plugin_active( "smartpost-templates/smartpost.php" ) ) && defined( "SP_PLUGIN_NAME" ) ){
add_submenu_page( 'smartpost', 'Настройки электронной почты', 'Настройки электронной почты', 'edit_dashboard', 'sp-email-settings', array($this, 'sp_render_email_admin_page') );
}
}
function sp_render_email_admin_page(){
?>
<p>Привет, мир</p>
<?php
}
}
$sp_admin_page = new SP_Email_Admin_Page();
Это приводит к странному поведению, как описано в этом посте. Подменю добавляется, но связано неправильно (префикс ‘admin.php?’ отсутствует). Я думаю, это связано с тем, что add_submenu_page определен вне той же области, где была определена родительская страница меню – но я не уверен, почему это может быть фактором. Это поднимает два вопроса: 1) Почему это происходит и 2) Как плагины, такие как WooCommerce, позволяют разработчикам сторонних плагинов создавать подменю для страницы администратора WooCommerce, когда add_submenu_page() скорее всего определен вне той же области, что и родительская страница меню WooCommerce?
Я переименовал папку плагина “SmartPost E-mail”, чтобы она загружалась после плагина “SmartPost” – я думаю. Я почти уверен, что это “странное” поведение связано с порядком, в котором загружаются плагины. Если плагин загружается до своего “родительского” плагина, тогда, вероятно, произойдет упомянутое выше странное поведение.
Внутри вашей sp_add_email_admin_page
попробуйте дублировать функцию add_menu
перед добавлением add_submenu_page
function sp_add_email_admin_page(){
if( ( is_plugin_active( "smartpost-templates/smartpost.php" ) ) && defined( "SP_PLUGIN_NAME" ) ){
add_menu_page( SP_PLUGIN_NAME, SP_PLUGIN_NAME, 'edit_dashboard', 'smartpost', array('sp_admin', 'sp_template_page'), 'dashicons-menu', null );
add_submenu_page( 'smartpost', 'Настройки электронной почты', 'Настройки электронной почты', 'edit_dashboard', 'sp-email-settings', array($this, 'sp_render_email_admin_page') );
}
}
Попробуйте этот код:
class SP_Email_Admin_Page
{
function __construct()
{
add_action( 'admin_menu', array($this, 'sp_add_email_admin_page') );
}
function sp_add_email_admin_page()
{
if( ( is_plugin_active( "smartpost-templates/smartpost.php" ) ) && defined( "SP_PLUGIN_NAME" ) )
{
add_submenu_page( 'smartpost', 'Настройки электронной почты', 'Настройки электронной почты', 'theme-option', 'sp-email-settings', array($this, 'sp_render_email_admin_page') );
}
}
function sp_render_email_admin_page()
{
?>
<p>Привет, мир</p>
<?php
}
}
$sp_admin_page = new SP_Email_Admin_Page();
Просто убедитесь, что вы используете более высокий приоритет для ваших хуков действия:
add_action( 'admin_menu', array( 'sp_admin', 'sp_admin_add_template_page' ), 999 );
Ответ или решение
Решение проблемы: отсутствует префикс ‘admin.php?’ в функции add_submenu_page()
Ваша ситуация касается создания подменю для административной панели в WordPress, а именно для плагина "SmartPost E-mails", который зависит от "SmartPost". Проблема заключается в том, что при добавлении подменю в "SmartPost", ссылка ведет не так, как ожидалось: отсутствует префикс ‘admin.php?’. Рассмотрим причины и решения данной проблемы.
1. Причина проблемы
Ошибка может возникать из-за положения в котором происходит выполнение функции add_submenu_page()
. Если порядок загрузки плагинов нарушен и подменю добавляется раньше, чем основной элемент меню, это может привести к некорректной формировке URL.
Ваша текущая реализация:
function sp_add_email_admin_page() {
if ( ( is_plugin_active( "smartpost-templates/smartpost.php" ) ) && defined( "SP_PLUGIN_NAME" ) ) {
add_submenu_page( 'smartpost', 'E-mail Settings', 'E-mail Settings', 'edit_dashboard', 'sp-email-settings', array($this, 'sp_render_email_admin_page') );
}
}
В этом фрагменте кода проверяется наличие плагина "SmartPost", и если он активен, добавляется подменю. Однако, если add_menu_page
для "SmartPost" не был выполнен до этого, это приведет к тому, что подменю будет создано без корректной привязки к главному элементу меню.
2. Как это исправить
Вам следует гарантировать, что add_menu_page()
для "SmartPost" вызывается перед добавлением подменю в "SmartPost E-mails". Существует несколько подходов для решения этой проблемы:
-
Воспользуйтесь приоритетом в акциях: Измените порядок вызова ваших функций с использованием параметра приоритета в
add_action()
. Убедитесь, что вызовadd_menu_page()
происходит с более высоким приоритетом.add_action('admin_menu', array('sp_admin', 'sp_admin_add_template_page'), 10); add_action('admin_menu', array($this, 'sp_add_email_admin_page'), 20);
-
Измените порядок загрузки плагинов: Убедитесь, что "SmartPost" загружается до "SmartPost E-mails". Это можно сделать, например, через редактирование файла плагина или использование механизма зависимостей.
3. Пример исправленного кода
Попробуйте следующий код для вашего плагина "SmartPost E-mails":
class SP_Email_Admin_Page {
function __construct() {
add_action('admin_menu', array($this, 'sp_add_email_admin_page'), 20);
}
function sp_add_email_admin_page() {
if ( ( is_plugin_active( "smartpost-templates/smartpost.php" ) ) && defined( "SP_PLUGIN_NAME" ) ) {
add_submenu_page('smartpost', 'E-mail Settings', 'E-mail Settings', 'edit_dashboard', 'sp-email-settings', array($this, 'sp_render_email_admin_page'));
}
}
function sp_render_email_admin_page() {
echo '<p>Hello World</p>';
}
}
$sp_admin_page = new SP_Email_Admin_Page();
Этот код гарантирует, что sp_add_email_admin_page
будет вызван после создания основного меню "SmartPost", что исправит проблемное поведение с ссылкой.
Заключение
Используя вышеуказанные рекомендации, вы сможете устранить проблему с отсутствием префикса ‘admin.php?’ и корректно добавить подменю для административной панели. Не забудьте внимательно следить за порядком загрузки ваших плагинов и приоритетами вызова функций, чтобы избежать подобной проблемы в будущем.