首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >管理子菜单不调用函数来加载页面。

问管理子菜单不调用函数来加载页面。
EN

WordPress Development用户
提问于 2018-02-15 14:47:16
回答 1查看 1.5K关注 0票数 0

上下文

我正在用复杂的架构制作一个大插件。我想在我的插件架构,分割页面和菜单建设在管理端。

所以我有这样的类:Menu.php,Submenu.php和Page.php,SubPage.php

我想,当管理员clik在菜单/子菜单链接时,它在Menu.php和Submenu.php中运行一个公共函数回调,只加载正确的页面或子页,感谢$_GET['page']。

问题

每个子菜单链接不再绑定子页面。

所有子菜单链接的href都采用这种格式:

代码语言:javascript
复制
https://my-site.org/wp-admin/my-slug-page

而不是:

代码语言:javascript
复制
https://my-site.org/wp-admin/admin.php?page=my-slug-page

Submenu.php

代码语言:javascript
复制
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链接是完美的。

有人知道应该是什么吗?

EN

回答 1

WordPress Development用户

发布于 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。
  • 用于init任何页/子页的静态函数对所有页面都是相同的。

所以我制作了PageTrait.php,它用于Page.php和SubPage.php。

这是代码:

SubMenu.php

代码语言:javascript
复制
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

代码语言:javascript
复制
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

代码语言:javascript
复制
class Page {

    use PageTrait;
    ....
}

SubPage.php

代码语言:javascript
复制
class SubPage{

    use PageTrait;
    ....
}
票数 0
EN
页面原文内容由WordPress Development提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://wordpress.stackexchange.com/questions/294188

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档