如何在另一个插件菜单下添加新的自定义子菜单

Posted

技术标签:

【中文标题】如何在另一个插件菜单下添加新的自定义子菜单【英文标题】:How to add new custom submenu under another plugins menu 【发布时间】:2011-01-15 11:25:54 【问题描述】:

在我的 WP 管理页面中有一个名为 Shopp 的插件,这个插件有***菜单“Shopp”。

这是***菜单:

$menus['main'] = add_menu_page('Shopp', 'Shopp', SHOPP_USERLEVEL, 'shopp-orders', array(&$this,'orders'));

我创建了一些插件,需要在“Shopp”***菜单下添加为子菜单,所以它正在添加子菜单(链接.....wp-admin/admin.php?page=ach-faq .php ),但当我点击子菜单时,它显示“您没有足够的权限访问此页面。”

调试结果:

Pagenow = admin.php
Parent = shopp-orders
Hookname = shopp_page_ach-faq
Menu = Array
Submenu = Array
Menu nopriv = Array
Submenu nopriv =
Plugin page = ach-faq.php
Registered pages =

我的代码:

function ach_faq_menu()
 add_submenu_page('shopp-orders', 'My FAQ Plugin', 'My FAQ Plugin', 8, __FILE__, 'section_1');

function section_1()
 echo 'Text';

add_action('admin_menu', 'ach_faq_menu');

我该如何解决这个问题?请帮帮我!

【问题讨论】:

【参考方案1】:

菜单和子菜单页面应该同时被调用,并且使用相同的 slugs。例如

add_action("admin_menu", "createMyMenus");

function createMyMenus() 
    add_menu_page("My Menu", "My Menu", 0, "my-menu-slug", "myMenuPageFunction");
    add_submenu_page("my-menu-slug", "My Submenu", "My Submenu", 0, "my-submenu-slug", "mySubmenuPageFunction");

这将产生一个***菜单“我的菜单”,其子菜单是“我的子菜单”。

当您将 FILE 用于 submenu-slug 时,似乎会出现无效权限错误。

【讨论】:

为什么不在文档中。子菜单页面需要相同的 slug 并不明显。 @TimJoyce 他们不需要同样的蛞蝓。子菜单需要父项。如果你想要一个默认的子菜单,我不明白你为什么不这样做,你需要使用相同的 slug。如果您要单击与所有子级别不同的***级别,则可以执行操作,但这会增加混乱。标准做法是让第一个子菜单共享 slug,其操作将覆盖父项的操作。 我按照这篇文章在一个活动插件的主菜单下创建了一个子菜单,就这么简单。 developer.wordpress.org/plugins/administration-menus/sub-menus【参考方案2】:

您可以通过添加插件文件夹名称和插件主页。 例如,我通过以下方式连接到 Newsletter 插件:

<?php 

add_action('admin_menu', 'add_newsletter_extra_page');

function add_newsletter_extra_page()
    add_submenu_page( 
        'newsletter/intro.php', 
        'Newsletter', 
        'Subscribers Plus', 
        1, //$capability, 
        'subscribers-plus',
        'newsletter_list_addon' );

?> 

【讨论】:

【参考方案3】:

正如Altari 所说:

菜单和子菜单页面应该同时调用

SAME TIME - add_submenu_page 必须从与 add_menu_page 相同的函数调用,原始插件中的函数。您不能从外部“侵入”另一个插件菜单。

【讨论】:

【参考方案4】:

转到外观 -> 菜单 然后在自定义链接下创建菜单,然后在右侧创建一个新菜单。现在您可以将其拖放到您想要的***菜单下。

【讨论】:

问题是关于管理菜单,而不是前端菜单。【参考方案5】:

您可以将子菜单添加到现有的自定义菜单(由其他插件添加),但有点棘手

您可以创建菜单,然后在添加具有相同 slug 和回调的子菜单后删除菜单本身。

请试试这个代码:

add_action( 'admin_menu', 'add_shopp_submenu' );
function add_shopp_submenu()
    add_menu_page( __('New Menu', 'your-plugin-text-domain'), __('New Menu', 'your-plugin-text-domain'), 'read', 'ach-faq', 'your_menu_callback');
    add_submenu_page( 'shopp-orders', __('New Menu', 'your-plugin-text-domain'), __('New Menu', 'your-plugin-text-domain'), 'read', 'ach-faq', 'your_menu_callback' );
    remove_menu_page('ach-faq');


function your_menu_callback()
    echo "string";

【讨论】:

【参考方案6】:
/*create any function name*/
function process_post() 

 add_menu_page(__('nLr','menu-test'), __('My Plugin','menu-test'), 'manage_options','myplugin', 'myplguin_admin_page', 'dashicons-tickets', 6 );

add_submenu_page('myplugin', __('My Plugin Edit', 'menu-test'), __('My Plugin Edit', 'menu-test'), 'manage_options', 'myplugin_edit', 'myplugin_edit');

 
/*create callback function for main menu*/

function myplguin_admin_page()
    echo"welcom to my plugin menu";



/* create callback function for submenu */

function myplugin_edit()
    echo"welcome to submenu";

add_action( 'admin_init', 'process_post' );
?>

【讨论】:

【参考方案7】:

要将其添加到插件的父菜单之一,请使用 add_submenu_page() 并将 add_action() 的优先级设置为较低,即高于 10。

然后在 add_submenu_page() 中,将 'plugin-parent-menu-slug' 替换为要添加的父菜单的 slug。例如,您想将其添加到带有 slug /wp-admin/admin.php?page=plugin-parent-menu-slug 的管理页面下。

// set priority to lower i.e. greater than 10
add_action( 'admin_menu', 'my_admin_menu', 20 );

function my_admin_menu() 
    add_submenu_page( 'plugin-parent-menu-slug', 'New Menu', 'New Menu', 'manage_options', 'my-admin-slug', 'my_admin_page' );


function my_admin_page()
    echo "My Admin Page";

【讨论】:

以上是关于如何在另一个插件菜单下添加新的自定义子菜单的主要内容,如果未能解决你的问题,请参考以下文章

如何在MDI的主窗口菜单中新建一个菜单选项,点击该选项建立一个新的子窗口

如何使用菜单布局将自定义项添加到 NavigationView?

Qt QTreeWidget 上下文菜单:在另一个下添加项目或删除项目。

如何在反应选择下拉菜单中的选项下添加子选项?

Jquery mmenu:如何在所有子菜单打开的情况下启动?

我怎么能在另一个小部件中使用 QColorDialog 而不是单独的对话框?