如何只向具有某些功能的用户显示管理栏菜单项?

时间:2011-05-19 作者:m-torin

我正在尝试将项目添加到管理栏,但仅适用于具有某些功能的用户,例如add_movies 在插件中。问题是,根据@toscho@TheDeadMedic, 插件按照操作顺序过早地执行其代码,无法使用current_user_can.

我试过使用if ($user->has_cap(\'add_movies\')) 但是,获取Fatal error: Call to a member function has_cap() on a non-object in xxx.

我是缺少一个明显的全局解决方案,还是解决方案更复杂?

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

如果您只是在插件文件中这样写,那么该检查将被过早调用:

if ( current_user_can( \'add_movies\' ) ) {
    add_action( \'admin_bar_menu\', \'wpse17689_admin_bar_menu\' );
}
function wpse17689_admin_bar_menu( &$wp_admin_bar )
{
    $wp_admin_bar->add_menu( /* ... */ );
}
因为它将在加载插件时执行,这是启动过程的早期阶段。

您应该做的是始终添加操作,但在回调中检查current_user_can(). 如果无法执行该操作,只需返回而不添加菜单项即可。

add_action( \'admin_bar_menu\', \'wpse17689_admin_bar_menu\' );
function wpse17689_admin_bar_menu( &$wp_admin_bar )
{
    if ( ! current_user_can( \'add_movies\' ) ) {
        return;
    }
    $wp_admin_bar->add_menu( /* ... */ );
}

SO网友:kaiser

尝试一下if ( current_user_can(\'capability\') ) : /* your code */; endif;

编辑:还没有完全阅读你的Q。您是否尝试过以下方法?

global $current_user;
get_currentuserinfo();

// Here you can start interacting with everything the current user has:
echo \'<pre>\';
    print_r($current_user); // show what we got to offer
echo \'</pre>\';

// Then you\'ll have to do something with the role to get the caps and match against them

结束

相关推荐