我有两个插件——一个是名为“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管理页创建子菜单?
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\') );
}
}