将参数传递给管理菜单页面回调?

时间:2011-05-05 作者:Luis

Situation: 我正在开发一个插件,并将其开发为一个类,在遇到这种情况之前,一切都很好。我想把东西弄干净一点,试了一下这个。。

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
我尝试了很多不同的选择,但都不管用,也许我在前面,但我看不到。

当然,这是一次重新创建,我在所有函数前面加了前缀,它们与我在这里写的不完全一样,但我希望你明白我的意思。

Thanks in advance.

P、 D:如果你想看原始源代码,我很乐意粘贴它并给你链接。

5 个回复
最合适的回答,由SO网友:Jan Fabry 整理而成

不能将参数传递给回调函数。add_menu_page() adds it as an action handler, 和admin.php fires the action, 没有任何争论。

我看到了两种解决这个问题的简单方法。一种是将所有文件名存储在类中的一个数组中,并按钩子名进行索引。然后,您可以使用它查找需要加载的文件(您还可以在此数组中存储其他数据)。

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在回答中所建议的那样。

SO网友:user35752

您可以始终只使用匿名函数(或闭包)。影响的事物:

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

SO网友:Scott

函数load\\u视图应如下所示:

function load_view($filename) {
    include(dirname(__FILE__).\'/views/\'.$filename.\'.php\');
}
在include文件中,它应该回显所显示页面的任何内容。

编辑:

以下是《法典》对此事的表述:

$menu_slug (string) (required) 引用此菜单的slug名称(对于此菜单应是唯一的)。在版本3.0之前,这被称为文件(或句柄)参数。如果省略了函数参数,menu\\u slug应该是处理菜单页面内容显示的PHP文件。默认值:无

$function显示菜单页面的页面内容的功能。从技术上讲,function参数是可选的,但如果没有提供,那么WordPress基本上会假设包含PHP文件将生成管理屏幕,而不调用函数。大多数插件作者选择将页面生成代码放在主插件文件中的函数中:如果指定了函数参数,则可以使用任何字符串作为文件参数。这允许使用诸如?page=my\\u super\\u plugin\\u page而不是?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\')
                 );
}

SO网友:Jeff Vdovjak

我解决了这个问题,只需将ID(或任何需要的数据)附加到菜单slug。

例如:

 add_menu_page( \'Plugin name\',
                       \'Plugin name\',
                       \'manage_options\',
                       \'my-plugin-settings-\' . $identifier,
                       \'setting-function-callback\'
                     );
然后,这将创建一个带有“我的插件设置文件名”的URL(作为示例),我只需解析URL的这一部分(使用$\\u GET或filter\\u输入)。

SO网友:Lordgretix

基于user35752 答案是,您甚至可以使用带有参数的对象方法作为回调。

$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)

结束

相关推荐

获取在Functions.php中设置的变量,并在我的Custom Post模板中回显它们

在我的函数中设置了以下函数。php文件,以允许我的自定义帖子类型“Slideshow”工作。add_action( \'the_post\', \'paginate_slide\' ); function paginate_slide( $post ) { global $pages, $multipage, $numpages; if( is_single() && get_post_type() == \'lom_s