上下文
我正在用复杂的架构制作一个大插件。我想在我的插件架构,分割页面和菜单建设在管理端。
所以我有这样的类:Menu.php,Submenu.php和Page.php,SubPage.php
我想,当管理员clik在菜单/子菜单链接时,它在Menu.php和Submenu.php中运行一个公共函数回调,只加载正确的页面或子页,感谢$_GET['page']。
问题
每个子菜单链接不再绑定子页面。
所有子菜单链接的href都采用这种格式:
https://my-site.org/wp-admin/my-slug-page而不是:
https://my-site.org/wp-admin/admin.php?page=my-slug-pageSubmenu.php
class SubMenu {
public $parent_slug;
public $page_title;
public $menu_title;
public $capability;
public $menu_slug;
public $priority;
public function __construct( $parent_slug, $page_title, $menu_title, $capability, $menu_slug, $priority = 10 ) {
$this->parent_slug = $parent_slug;
$this->page_title = $page_title;
$this->menu_title = $menu_title;
$this->capability = $capability;
$this->menu_slug = $menu_slug;
$this->priority = $priority;
// Initialize the component
add_action( 'admin_menu', array( $this, 'add_submenu' ), $this->priority );
}
public function add_submenu() {
$page_hook = add_submenu_page(
$this->parent_slug,
_x( $this->page_title, "page_title", PLUGIN_DOMAIN ),
_x( $this->menu_title, "menu_title", PLUGIN_DOMAIN ),
$this->capability,
$this->menu_slug,
array( $this, "output_rooter" )
);
}
public function output_rooter(){
// check $_GET['page'] value
...
// Load the right SubPage class with the view
$class = strToKamelCase( $_GET['page'] );
new $class(); //<-- extends SubPage.php
...
}
}函数output_rooter从未被调用,每次单击子菜单链接时都会有一个404错误。
注意:与菜单链接,它正确的工作,所有的href链接是完美的。
有人知道应该是什么吗?
发布于 2018-02-16 17:02:56
我找到了解决办法。
Problem & of;/#>
当wordpress核心找不到函数回调或函数
add_menu_page()和add_submenu_page()为空时,href将生成如下:http(s)://my-site.org/wp-admin/my-slug-page,否则href将以以下格式生成:http(s)://my-site.org/wp-admin/admin.php?page=my-slug-page
因此,在我的例子中,我必须确保函数回调被调用。
<#>Problem将菜单绑定到页面,并仅加载当前页
我不得不在add_submenu_page()中调用一个静态的公共函数,该函数位于我的页面类中。
Page.php。SubPage.php。所以我制作了PageTrait.php,它用于Page.php和SubPage.php。
这是代码:
SubMenu.php
class SubMenu {
public $parent_slug;
public $page_title;
public $menu_title;
public $capability;
public $menu_slug;
protected $subpage_class; //<-- new argument used for the submenu function callbak
public $priority;
public function __construct( $parent_slug, $page_title, $menu_title, $capability, $menu_slug, $subpage_class, $priority = 10 ) {
$this->parent_slug = $parent_slug;
$this->page_title = $page_title;
$this->menu_title = $menu_title;
$this->capability = $capability;
$this->menu_slug = $menu_slug;
$this->subpage_class = $subpage_class;
$this->priority = $priority;
// Initialize the component
add_action( 'admin_menu', array( $this, 'add_submenu' ), $this->priority );
}
public function add_submenu() {
$page_hook = add_submenu_page(
$this->parent_slug,
_x( $this->page_title, "page_title", PLUGIN_DOMAIN ),
_x( $this->menu_title, "menu_title", PLUGIN_DOMAIN ),
$this->capability,
$this->menu_slug,
array( $this->subpage_class, "init_page" )
);
}
}PageTrait.php
trait PageTrait {
public static function init_page(){
//Code to init the right page
//1.Get data for the constructor
...
//2.Get the class path
...
new $classPath( $data );
}
}Page.php
class Page {
use PageTrait;
....
}SubPage.php
class SubPage{
use PageTrait;
....
}https://wordpress.stackexchange.com/questions/294188
复制相似问题