web-dev-qa-db-ja.com

管理ページを追加する - OOP アプローチがうまくいかない

次のものを含む親クラスがあります。

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
    }
}

この方法ではうまくいかず、管理メニュー項目とページが追加されたのがわかりません。私が試した2番目のアプローチ:

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');
    }
}

どうやって動かすの?私の考えは他のクラスにすべてのダッシュボード関連のものを分けることです。

更新: /最初のアプローチはうまくいき、メニュー項目が追加されました。しかし、ページマークアップを出力するコールバック関数は機能しないようです。タイプミスをチェックしましたが、すべて問題ないようです。

2

私はOOPがWordPressの機能構造に混ざっているのが嫌いです(ここでは評価が下がります.....)。名前のスペースとしてOOPを使用する場合は、PHPの名前のスペース機能を使用してください。クラスに関数を含めることは、OOPの内容のごく一部にすぎません。

とにかく、あなたの問題は、それが specific オブジェクトに関連付けられている場合と、クラス内で静的である場合(基本的にはクラスに関連付けられているが、メソッドには関連付けていない場合)のどちらかです。オブジェクト)。あなたのコードでは、それが静的なものであるかのようにオブジェクトバインド関数を扱おうとします(あなたがあなたのエラーログをチェックするならば、あなたは何らかの関連エラーを見るであろうと確信しています)。これを修正するには2つの方法があります。1.関連する関数を静的にして、2番目のバリエーションの構文を使用します。2.シングルトンパターンを使用し、ダッシュボードクラスのオブジェクトをインスタンス化します。最初のバリエーションで名前を付けます。の代わりに

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();
}

そして、常に完全なエラー報告を使ってコードをデバッグし、すべてのエラーと通知を修正してください。

3
Mark Kaplun

作業例

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'));
2
Amjad Ali