シチュエーション: 私はプラグインを開発しています。クラスとして開発しています。この状況に遭遇するまで、すべてうまくいきました。私は物事を少しきれいにしたいと思ってこれを試してみました..
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:あなたがオリジナルのソースコードを見たいのであれば、私はそれを貼り付けてあなたにリンクを与えることを嬉しく思います。
コールバック関数に引数を渡すことはできません。 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はスラッグ名自体によって示されるファイルを含みます。
あなたはいつでも匿名関数(あるいはクロージャ)を使うことができます。以下の影響を受けるもの
add_menu_page( $page, $menu, $capability, $slug, function() { print_my_admin_page($with_args); }, $icon, $position);
関数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')
);
}
この問題を解決するために、メニューのスラッグに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を使って)解析することができます。