插件-管理菜单页面损坏的URL

时间:2018-06-13 作者:Nick

我正在开发一个插件。我在functions.php. 基本的想法是拥有一个默认菜单,它将是多个小型不同插件的父级。

我几乎都准备好了,但当我点击插件子菜单条目时,我遇到了一个问题。

URL已断开,无法转到正确的管理页

http://localhost/wp-admin/admin.php?page=my_page
它转到前端页面,该页面不可用,因此转到404。断开的URL如下所示:

http://localhost/wp-admin/my_page
正如你所见,admin.php?page= 第二个条目中缺少。

我已经做了一些调查,如果我从插件本身初始化菜单,而不是从functions.php 文件

一些代码可以证明这一点:

WORKING

public function add_menu_item()
{
        $page_reports = add_menu_page(__(\'Menu Page\', \'menu-page\'), __(\'Menu Page\', \'menu-page\'), \'read\', $this->parent->_token . \'_settings\', null, null, \'2.1\');
        add_submenu_page(\'menu-page\', __(\'Report\', \'menu-page\'), __(\'Report\', \'menu-page\'), \'read\', $this->parent->_token . \'_REPORT\', array($this, \'IncludePluginPage\'));
}

public function IncludePluginPage()
{
    include("../includes/index.php");
}

NOT WORKING

public function add_menu_item()
{
        //$page_reports = add_menu_page(__(\'Menu Page\', \'menu-page\'), __(\'Menu Page\', \'menu-page\'), \'read\', $this->parent->_token . \'_settings\', null, null, \'2.1\');
        add_submenu_page(\'menu-page\', __(\'Report\', \'menu-page\'), __(\'Report\', \'menu-page\'), \'read\', $this->parent->_token . \'_REPORT\', array($this, \'IncludePluginPage\'));
}

public function IncludePluginPage()
{
    include("../includes/index.php");
}

// Code from functions.php to generate the menu entry

function custom_admin_menu(){
    add_menu_page(\'Menu Page\', \'Menu Page\', \'read\', \'menu-page\', null, null, \'2.1\');
}
在这两种情况下,菜单都会正确显示,但当菜单从functions.php, 子菜单URL已断开。

我错过了什么?

请随意要求更多的代码,我真的不确定在这里添加什么可以尽可能多的帮助。

如果您想知道,我从以下模板开始:https://github.com/hlashbrooke/WordPress-Plugin-Template

1 个回复
最合适的回答,由SO网友:cjbj 整理而成

菜单由函数生成_wp_menu_output. 如果查看链接生成的位置(当前为第158-162和170-174行),您会发现admin.php?page= 部分在某些情况下被省略。其中一个是空的$menu_hook.

变量menu_hook 通过调用get_plugin_page_hook, 如果没有操作绑定到挂钩,则返回空。这意味着:没有定义回调函数来生成页面。

现在让我们看看hook order: 插件在主题之前加载,因此如果在父菜单之前生成子菜单(如果在主题的functions.php) 的第190-192行可能有问题add_submenu_page: 此时可能无法将操作绑定到挂钩,因为父页未定义。

免责声明:我从头开始分析了代码,所以我可能在那里犯了错误。

无论如何,如果您坚持从functions.php, 不要尝试初始化插件中的子菜单。相反,只需在插件中定义函数,并从主题调用它即可。

结束

相关推荐

WordPress Plugins won't save

我有一个WordPress网站,我刚刚接管了一个客户,因此我没有能力与以前的网站管理员/开发人员交谈。该网站使用的是YOOtheme对Subway稍加修改的版本。为了更新插件位置,Subway的一部分有“小部件选项”。我无法更改外观或小部件显示的页面,因为我无法保存任何内容。它看起来像已保存,但没有保存,或者您会在保存按钮旁边看到“加载循环”,它一直在运行。Things to note:<WordPress和插件是最新的。在我们转移到新服务器之前,插件是可更新的。新服务器有一个max\\u inpu