отсутствует префикс ‘admin.php?’ в функции add_submenu_page()

Вопрос или проблема

У меня есть два плагина – один из них “основной” плагин под названием “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?’ и корректно добавить подменю для административной панели. Не забудьте внимательно следить за порядком загрузки ваших плагинов и приоритетами вызова функций, чтобы избежать подобной проблемы в будущем.

Оцените материал
Добавить комментарий

Капча загружается...