添加管理页面-面向对象的方法不起作用

时间:2015-09-01 作者:Rutwick Gangurde

我有一个父类,其中包含以下内容:

use app\\My_Dashboard;

class My_Class {
    public function __construct() {
        add_action(\'admin_menu\', array($this, \'setup_dashboard_page\'));
    }

    public function setup_dashboard_page() {
        My_Dashboard::add_dashboard_page();
    }

}
以及具有管理页面功能的类:

class My_Dashboard {
    public static function add_dashboard_page() {
        add_menu_page(\'My Settings\', \'My Settings\', \'my-settings\', array($this, \'dashboard_page_cb\'));
    }

    public function dashboard_page_cb() {
        //The markup
    }
}
这种方法不起作用,我看不到添加的管理菜单项和页面。我尝试的第二种方法是:

use app\\My_Dashboard;

class My_Class {
    public function __construct() {
        add_action(\'admin_menu\', array($this, \'setup_dashboard_page\'));
    }

    public function setup_dashboard_page() {
        //Not very sure of the syntax, bad at OOP
        add_menu_page(\'My Settings\', \'My Settings\', \'my-settings\', \'My_Dashboard::dashboard_page_cb\');
    }
}
我如何让它工作?我的想法是将所有与仪表板相关的内容与其他类分离。

Update:第一种方法有效,并添加了菜单项。但是输出页面标记的回调函数似乎不起作用。我检查了拼写错误,但似乎一切正常。

3 个回复
最合适的回答,由SO网友:Mark Kaplun 整理而成

我讨厌在wordpress的功能结构中混入OOP(下面是反对票……)。如果使用OOP只是为了名称间隔,那么只需使用PHP的名称间隔特性,将函数放入类只是OOP应该是的一小部分。

无论如何,您的问题是,只有两种方法可以引用类方法,一种是当它与specific 对象,或者如果它在类中是静态的(基本上与类关联,但与对象无关)。在代码中,您试图将对象绑定函数视为静态函数(我确信,如果您检查错误日志,您将看到一些相关错误)。有两种可能的修复方法1。将相关函数设为静态,并使用第二个变量2中的语法2。使用单例模式,实例化dashboard类的对象,将其作为全局对象,并在第一个变体中使用它而不是类名。而不是

public function setup_dashboard_page() {
    My_Dashboard::add_dashboard_page();
}
执行

global $dashboard;
$dashboard = new my_dashboard()
.....
public function setup_dashboard_page() {
   global $dashboard;
    $dashboard->add_dashboard_page();
}
并且始终使用完整的错误报告调试代码,并修复所有错误和通知;)

SO网友:Amjad Ali

工作示例

class PluginSkeleton {

     public function __construct(){
          add_action(\'admin_menu\',array($this,\'pluginskeleton_menu\'));
     }
     public function pluginskeleton_menu(){
         add_menu_page( \'Application Users\', \'Application Users\', \'manage_options\', \'application-users.php\',array($this,\'application_users_page\'));
     }

    public function application_users_page(){
          echo \'i am here\';
     }

}
将$this与回调函数一起使用

add_menu_page( \'Application Users\', \'...\', ...\', \'...\',array($this,\'application_users_page\'));

SO网友:Amigo Dheena

您可以像这样简单地添加菜单页,我希望这是一种简单的方法

class MyPlugin{

    function __construct()
    {
        add_action(\'admin_menu\', array($this, \'add_menu_page_fun\'));
    }

    // Add Menu Page
    function add_menu_page_fun() {        
        add_menu_page(
            __(\'My Plugin Page\',\'myplugin-menupage\'), //Page title
            __(\'My Plugin Title\',\'myplugin-menu\'), //Menu title
            \'manage_options\', //capability
            \'my-plug-handle\', //menu_slug
            array($this, \'toplevel_page\'), //function
            \'dashicons-buddicons-activity\' //icon url
        );
    }
    
    // Displays the page content for the custom Toplevel menu
    function toplevel_page() {
        // echo "<h2>" . __( \'Welcome to admin page\', \'myplugin-menu\' ) . "</h2>";
        include \'My-admin.php\'; //new php file
    }

}

相关推荐

当回调作为数组的一部分传递时,不会在addsetingsfield()中调用,但会识别出它就在那里。它使用OOP将类传递到类

我正在构建一个插件,我创建了一个新的管理页面和子页面,在这个子页面中,我想添加一些设置。这就是我使用设置API构建它们的原因我正在使用Composer和面向对象编程。我有一个名为SettingsAPI的文件夹,名称空间如下namespace Blocks\\Pages\\SettingsAPI;在该文件夹中,我有三个文件:AddSettings.php, Settings.php 和SettingsLayout.php. 它们三个都正确连接。这些文件具有区分大小写的类名称。Settings.php 有一个