add_menu_page()add_submenu_page()|使用被调用的函数传递$变量

时间:2013-01-16 07:11:19

标签: wordpress

我在WordPress后端添加了一个菜单页面,其中包含一些子菜单项。 我使用的代码片段是:

// Add to admin_menu function
add_menu_page(__('New Menu'), __('New Menu Title'), 'edit_themes', 'new_menu_item', 'functiontocallonclick', '', 3.5);
// Add to secondlevel menu
add_submenu_page('new_menu_item', __('New |Sub Menu item'), __('New Menu Title item'), 'edit_themes', 'new_menu_sub_item', 'subfunctiontocallonclick',');

正如您在上面看到的那样,当你转到后端的New菜单项时,它会调用函数functiontocallonclick。

我现在想知道的是: 我想用函数传递一个变量。

functiontocallonclick($value);

当然不能这样做,那么有什么好方法呢?

我用这个:

switch($_GET['page']){
    case 'suppliers': $type='c';
        break;
    case 'contractors': $type='s';
        break;
    default: $type='';
        break;
}

但我试图找到更好的解决方案。

2 个答案:

答案 0 :(得分:0)

这个答案可能看起来有点晚,但我会分享我如何解决这个问题,因为看起来很多人都在寻找这个问题的答案。

我的答案是将变量传递给基于类的上下文中的嵌套函数,因此如果您使用的是函数式编程,则忽略 $this。


主要钩子动作:

function mainSetup(){
   add_action('admin_menu', array($this, 'mainMenuSetup'));
   add_action('admin_menu', array($this, 'subMenuSetup'));
}

菜单设置:

function mainMenuSetup(){
        add_menu_page('DashBoard',
                    'DashBoard',
                    'manage_options',
                    '[yoursitesname]-admin-menu',
                    function(){ $this->pageSelect("admin"); },
                    '',
                    200
                    );  
}

在主菜单导航选项的示例中,我们在嵌套函数中传递了一个字符串,该字符串将作为参数传递给 method(function) 'pageSelect',但该字符串是硬编码的,无法更改容易地。我们将在设置子菜单时解决这个问题。

TODO:您应该替换 [yoursitename]。


子菜单设置:

对于子菜单,假设我们希望更轻松地返回并添加新子菜单并更改谁有权访问哪些子菜单。为此,我将创建一个名为“subMenuObjects”的关联数组,其中数组的键是子菜单对象,它们的值是页面的权限。

function subMenuSetup(){

    $subMenuObjects = array(
                    'Settings' => 'manage_options',
                    'Services' => 'manage_options'
    );


    foreach ($subMenuObjects as $subMenu => $value) {

        add_submenu_page('[yoursitesname]-admin-menu',
            $subMenu . 'Page',
            $subMenu,
            $value, 
            '[yoursitesname]' . strtolower($subMenu) . '-menu', 
            function() use ($subMenu){ $this->pageSelect($subMenu); }
        );
    }
}

这里我们使用 'use' 将 $subMenu 传递给嵌套函数。


页面选择:

function pageSelect($page){
    
        switch ($page) {
            case 'admin':
                echo '<div>Welcome to the Admin page</div>';
                break;
            case 'Settings':
                echo '<div>Welcome to the Settings page</div>';
                break;
            case 'Services':
                echo '<div>Welcome to the Service page</div>';
                break;
            
            default:
                echo '<div>something happened, contact dev</div>';
                break;
        }

}

答案 1 :(得分:-1)

是的,你这样做的方式就是WordPress自己做的方式。要重新使用管理员屏幕,您必须在URL中传递一些查询var,然后根据它显示/隐藏元素。

您还可以创建隐身管理界面:How to enable additional page in WordPress custom plugin?。这也可能有用:Redirect from add_menu_page