Context
Я делаю большой плагин со сложной архитектурой. Я хотел бы в своей архитектуре плагинов разделить страницы и меню на стороне администратора.
Итак, у меня есть следующие классы: Menu.php
, Submenu.php
и Page.php
, SubPage .php
Я хотел бы, чтобы, когда администратор нажимал на ссылки меню /подменю, он выполнял общий обратный вызов функций внутри Menu.php
и подменю. php
, который загружает только нужную страницу или подстраницу благодаря $ _ GET ['page']
.
Проблема
Каждая ссылка подменю больше не связывает подстраницу.
Все ссылки на подменю имеют следующий формат:
https://my-site.org/wp-admin/my-slug-page
вместо:
https://my-site.org/wp-admin/admin.php?page=my-slug-page
Submenu.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 прекрасны.
Кто-то понял, что это должно быть?
Ответы и комментарии:
Проблема hrefs
когда ядро 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
Так что в моем случае я должен был быть уверен, что функции обратного вызова вызываются.
Проблема связать меню со страницей и загрузить только текущую страницу
Мне пришлось вызвать статическую публичную функцию в 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 $ menu_slug;
защищенный $ subpage_class; // <- новый аргумент, используемый для callbak функции подменю
публичный приоритет $;
публичная функция __construct ($ parent_slug, $ page_title, $ menu_title, $ability, $ menu_slug, $ subpage_class, $ priority = 10) {
$ this-> parent_slug = $ parent_slug;
$ this-> page_title = $ page_title;
$ this-> menu_title = $ menu_title;
$ this- >ability = $ability;
$ this-> menu_slug = $ menu_slug;
$ this-> subpage_class = $ subpage_class;
$ this-> priority = $ priority;
// Инициализируем компонент
add_action ('admin_menu', массив ($ this, 'add_submenu'), $ this-> priority);
}
публичная функция 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-> возможности,
$ This-> menu_slug,
массив ($ this-> subpage_class, "init_page")
);
}
}
PageTrait.php
черта PageTrait {
публичная статическая функция init_page () {
// Код для инициализации нужной страницы
//1.Получить данные для конструктора
...
//2.Get путь к классу
...
новый $ classPath ($ data);
}
}
page.php
класс Page {
использовать PageTrait;
....
}
SubPage.php
class SubPage {
использовать PageTrait;
....
}