Вопрос: Подменю администратора не вызывает функцию для загрузки страницы

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;
    ....
}
Создан 16-02-2018 05:56 J.BizMai207115