问题描述

情况:我正在开发一个插件,我正在开发一个类,一切正常,直到遇到这种情况。我想让事情有点清洁,并尝试这个..

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 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。