添加_子菜单_页面()链接缺少‘admin.php?’前缀

时间:2014-10-01 作者:rafiki_rafi

我有两个插件——一个是名为“SmartPost”的“主要”插件,我正试图用另一个名为“SmartPost电子邮件”的插件对其进行扩展。因此,换句话说,“SmartPost电子邮件”扩展并依赖于“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\', \'Settings\', \'Settings\', \'edit_dashboard\', \'sp-cat-page\', array(\'sp_admin\', \'sp_settings_page\') );
    }
}
在我的“SmartPost电子邮件”插件中,我想向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\', \'E-mail Settings\', \'E-mail Settings\', \'edit_dashboard\', \'sp-email-settings\', array($this, \'sp_render_email_admin_page\') );
        }
    }

    function sp_render_email_admin_page(){
        ?>
        <p>Hello World</p>
        <?php
    }
}
$sp_admin_page = new SP_Email_Admin_Page();
这会导致出现奇怪的行为,如中所述this post. 子菜单已添加,但链接不正确(缺少“admin.php?”前缀)。我认为这与add\\u submenu\\u页面定义在父菜单页面定义的相同范围之外的事实有关,但我不确定为什么这会是一个因素。这就引出了两个问题:1)为什么会发生这种情况,2)当add\\u submenu\\u page()很可能定义在与父WooCommerce菜单页相同的范围之外时,WooCommerce等插件如何允许第三方插件开发人员为WooCommerce管理页创建子菜单?

4 个回复
SO网友:Pulkit Ambliya

Try this code:

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\', \'E-mail Settings\', \'E-mail Settings\', \'theme-option\', \'sp-email-settings\', array($this, \'sp_render_email_admin_page\') );
        }
    }

    function sp_render_email_admin_page()
    {
        ?>
        <p>Hello World</p>
        <?php
    }
}
$sp_admin_page = new SP_Email_Admin_Page();
SO网友:rafiki_rafi

我重命名了“SmartPost E-mail”插件文件夹,以便在“SmartPost”插件之后加载-我想。我很确定这种“奇怪”的行为与插件加载的顺序有关。如果插件在其“父”插件之前加载,则可能会发生上述奇怪行为。

SO网友:psorensen

在您的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\', \'E-mail Settings\', \'E-mail Settings\', \'edit_dashboard\', \'sp-email-settings\', array($this, \'sp_render_email_admin_page\') );
    }
}

SO网友:tomyam

只需确保对动作挂钩使用更高的优先级:

add_action( \'admin_menu\', array( \'sp_admin\', \'sp_admin_add_template_page\' ), 999 );

结束

相关推荐