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


14

状況:私はプラグインに取り組んでおり、それをクラスとして開発していますが、この状況に陥るまではすべてうまくいきました。私は物事を少しきれいにしたかったので、これを試しました。

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

私はさまざまなオプションを試しましたが、何も機能しません。たぶん私はそれの前にいますが、見えません。

もちろん、これは再作成であり、すべての機能に接頭辞を付けました。これらはここに書いたとおりのものではありませんが、私が求めているアイデアが得られることを願っています。

前もって感謝します。

PD:元のソースコードをご覧になりたい場合は、貼り付けてリンクをお知らせいたします。

回答:


8

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

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

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はスラッグ名自体で示されるファイルを含めます。


ああ、どうしてそんなことをやろうと思わなかったのか?(
ブレイディ

うん!あなたは今日数十匹の子猫を救った。非常に賢い解決策。ご協力ありがとうございました@Brady @Jan Fabry
ルイス

4

常に匿名関数(またはクロージャ)を使用できます。影響のあるもの:

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

1
これは私にはうまくいきません。私はWordPress 4.1を使用しています(そして今日4.1.1現在)
ジェフVdovjak

賢い!そしてそれは動作します。以下に、より完全な例を示します。hastebin.com / segibugiceは、example.com
wp

無名関数のスコープに変数を渡すときは、「use」キーワードを使用する必要があります。function() use ($my_var) { // now you can use $my_var }
-user35752

0

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

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

インクルードファイルでは、表示されているページのコンテンツをエコーする必要があります。

編集:

コーデックスがこの問題について述べていることは次のとおりです。

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

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

したがって、これから収集できるのは、関数を空のままにすると、設定した内容に基づいてphpファイルをインクルードしようとすることですmenu_slug

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

@Brady私はそれを知っています、そして、静的な値を使うとき、関数「load_view」はうまく働いて、コンテンツを正しく出力しています。例:incl .... / views / my-panel.php ');
ルイス

@Luis-問題は何ですか?
ブレイディ

@Brady array(&$ this、 'load_view')// $ filenameの値はどこで指定しますか?? array(&$ this、 'load_view( "my-value")')のようなことはできません)呼び出している関数にパラメーターを渡す方法を見つけたいです
ルイス

わかった クラス関数を渡しますが、パラメーターを使用します。まあアイブは見て、見て、あなたがそれを行う方法を見つけることができません。しかし、あなたはクラスに合格しているので、EDIT 2に入力したことを実行できませんか?
ブレイディ

@Brady:2回目の編集はあまり役に立ちません。filename変数をオーバーライドするだけなので、常にになります"somethingelse"。最初の編集はここでのコツかもしれload_viewません:ファイルを含めること以外に何もしない場合、実際にコールバック関数を渡さないでください。WordPressはスラグとして渡したページをロードしようとします。
ヤンファブリー

0

メニューのスラッグに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で)。


URLパラメーターを使用することもできますが、メニュー項目を作成する必要があります(必要に応じて非表示にできます)。
ジェフVdovjak

私のコードをコードブロックトーショに入れてくれてありがとう。質問をするときにボタンがありますが、回答でそれを行うマークアップに慣れていません。
ジェフVdovjak

0

user35752の回答に基づいて、コールバックとしてparamsを持つオブジェクトメソッドを使用することもできます。

$args = [ [new Foo(), 'bar'], [$param1, $param2, ...] ];

$callback = function () use ($args){
                call_user_func_array($args[0], $args[1]);
            };
add_menu_page( $page, $menu, $capability, $slug, $callback , $icon, $position)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.