问题描述
情况:我正在开发一个插件,我正在开发一个类,一切正常,直到遇到这种情况。我想让事情有点清洁,并尝试这个..
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
我已经尝试了一堆不同的选项,但没有任何作用,也许我在前面,但我看不到它。
当然这是一个 re-creation,我已经把所有的功能都放在前面了,而且并不完全符合我在这里所写的内容,但是希望你能得到我的要求。
提前致谢。
P.D .: 如果你想看到原始的源代码,我很乐意粘贴它并给你链接。
最佳解决方案
您不能将参数传递给回调函数。 add_menu_page()
将其添加为操作处理程序,admin.php
将触发该操作,而不会有任何参数。
我看到这个问题的两个简单的解决方案。一个是将所有文件名存储在你的类中的数组中,由钩子名称索引。然后,您可以使用它来查找需要加载的文件 (您还可以在此数组中存储其他数据) 。
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';
}
}
另一个是跳过回调参数,所以 WordPress 将包括由 slug 名称本身指示的文件,正如 Brady 在他的回答中所说。
次佳解决方案
您可以随时使用匿名函数 (或闭包) 。一些事情影响:
add_menu_page( $page, $menu, $capability, $slug, function() { print_my_admin_page($with_args); }, $icon, $position);
参考文献
注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。