web-dev-qa-db-ja.com

管理メニューページのコールバックに引数を渡す?

シチュエーション: 私はプラグインを開発しています。クラスとして開発しています。この状況に遭遇するまで、すべてうまくいきました。私は物事を少しきれいにしたいと思ってこれを試してみました..

class MyPlugin {
    function __construct() {
        add_action('admin_menu', array(&$this, 'myplugin_create_menus');
    }        

    //I don't want to write a function for every options page I create
    //so I prefer to just load the content from an external file.        
    function load_view($filename) {
        $view = require(dirname(__FILE__).'/views/'.$filename.'.php');
        return $view;
    }

    //Here is where the problem comes
    function myplugin_create_menus() {
        add_menu_page( 'Plugin name',
                       'Plugin name',
                       'manage_options',
                       'my-plugin-settings',
                       array(&$this, 'load_view') // Where do I specify the value of $filename??
                     );
    }

}#end of class

私はたくさんの異なるオプションを試してみましたが、何もうまくいきません、私はそれの前にいるかもしれませんが、私はそれを見ることができません。

もちろん、これは再作成です。私のすべての関数のプレフィックスはここに書いたとおりではありませんが、私が求めているというアイデアを得たことを願っています。

前もって感謝します。

P.D:あなたがオリジナルのソースコードを見たいのであれば、私はそれを貼り付けてあなたにリンクを与えることを嬉しく思います。

12
Luis

コールバック関数に引数を渡すことはできません。 add_menu_page()はアクションハンドラとして追加します 、そして admin.phpは引数なしでアクション を起動します。

この問題に対する2つの簡単な解決策があります。ひとつはフック名でインデックスされたあなたのクラスの配列に全てのファイル名を保存することです。その後、これを使用してロードする必要があるファイルを調べることができます(この配列に追加のデータを格納することもできます)。

class WPSE16415_Plugin
{
    protected $views = array();

    function load_view() {
        // current_filter() also returns the current action
        $current_views = $this->views[current_filter()];
        include(dirname(__FILE__).'/views/'.$current_views.'.php');
    }

    function myplugin_create_menus() {
        $view_hook_name = add_menu_page( 'Plugin name',
            'Plugin name',
            'manage_options',
            'my-plugin-settings',
            array(&$this, 'load_view'),
        );
        $this->views[$view_hook_name] = 'options';
    }
}

もう1つはコールバック引数をスキップすることです。そのため、Bradyが彼の答えで示唆しているように、WordPressはスラッグ名自体によって示されるファイルを含みます。

7
Jan Fabry

あなたはいつでも匿名関数(あるいはクロージャ)を使うことができます。以下の影響を受けるもの

add_menu_page( $page, $menu, $capability, $slug, function() { print_my_admin_page($with_args); }, $icon, $position);
4
user35752

関数load_viewは次のようになりますか?

function load_view($filename) {
    include(dirname(__FILE__).'/views/'.$filename.'.php');
}

そしてあなたのインクルードファイルでそれは表示されているページのためにどんな内容でもエコーするべきです。

編集:

これはコーデックスが問題について言っていることです:

$menu_slug (string) (required)このメニューを参照するスラッグ名(このメニューでは一意である必要があります)。バージョン3.0より前では、これはファイル(またはハンドル)パラメーターと呼ばれていました。 functionパラメーターが省略されている場合、menu_slugは、メニューページの内容の表示を処理するPHPファイルになります。デフォルト:なし

$functionメニューページのページ内容を表示する関数。技術的には、functionパラメータはオプションですが、提供されていない場合、WordPressは基本的にPHPファイルを含めることで関数を呼び出さずに管理画面が生成されると想定します。ほとんどのプラグインの作者は、メインプラグインファイル内の関数にページ生成コードを含めることを選択します。:functionパラメータが指定されている場合は、fileパラメータに任意の文字列を使用できます。これは?page = my-super-plugin/admin-options.phpの代わりに?page = my_super_plugin_pageのようなページの使用を許可します。

だから私はこれから集めることができるあなたが関数を空のままにした場合それはあなたがmenu_slugに設定したものに基づいてphpファイルをインクルードしようとするということです。

編集2

function load_view() {
    include(dirname(__FILE__).'/views/'.$this->filename.'.php');
}

function myplugin_create_menus() {
    $this->filename = "something";
    add_menu_page( 'Plugin name',
                   'Plugin name',
                   'manage_options',
                   'my-plugin-settings',
                   array(&$this, 'load_view')
                 );
    $this->filename = "somethingelse";
    add_menu_page( 'Plugin name',
                   'Plugin name',
                   'manage_options',
                   'my-plugin-settings',
                   array(&$this, 'load_view')
                 );
}
0
Brady

この問題を解決するために、メニューのスラッグにID(または必要なデータ)を追加するだけで済みました。

例えば:

 add_menu_page( 'Plugin name',
                       'Plugin name',
                       'manage_options',
                       'my-plugin-settings-' . $identifier,
                       'setting-function-callback'
                     );

これで、 'my-plugin-settings-filename'というURLが作成され(例として)、URLのその部分を($ _GETまたはfilter_inputを使って)解析することができます。

0
Jeff