使用CURRENT_USER_CAN()和相关函数的有效时间是什么?

时间:2015-08-10 作者:Rarst

在vanilla WP core加载期间,当前用户正在$wp-init() 在主题加载之后和之前init 钩这符合将功能与init 或更高版本。

然而,调用相关函数也是常见的做法,例如current_user_can() <比那更早。根据定义,这是用于加载过程早期阶段的插件所必需的(我的工具栏主题切换器插件就是一个例子)。

文档没有对这种做法提出任何主张或反对(我可以找到)。

然而,一些插件似乎与用户相关的功能相挂钩,并期望帖子——init 始终说明。

例如,bbPress抛出以下通知:

// If the current user is being setup before the "init" action has fired,
// strange (and difficult to debug) role/capability issues will occur.
if ( ! did_action( \'after_setup_theme\' ) ) {
    _doing_it_wrong( __FUNCTION__, __( \'The current user is being initialized without using $wp->init().\', \'bbpress\' ), \'2.3\' );
}
为了快速演示,请将此纳入core的定义中current_user_can():

function current_user_can( $capability ) {

    if ( ! did_action(\'after_setup_theme\') ) {
        echo wp_debug_backtrace_summary();
    }
在这种情况下,谁是“对的”?之前是否有关于允许/禁止使用用户相关功能的规范确定init ?

3 个回复
SO网友:fuxia

唯一的先决条件current_user_can() 是现有的wp_get_current_user(). 后者的定义见pluggable.php, 所以你可以在之后使用它plugins_loaded.

这个_doing_it_wrong() 你在问题中引用的电话本身是错误的。我猜是你从BuddyPress或bbPress那里得到的。如果它们不等待那么长时间,它们都会陷入递归。还有其他更好的方法来防止递归。

在某些情况下,比如changing the locale, 您可以更早地访问当前用户对象,因此等待after_setup_theme 甚至都不是一个选择。

SO网友:gmazzap

如果您以前检查过用户能力init 表示您有可能负责设置当前用户对象。

如果在init, 然后,您可以确定,其他一些东西已经设置了用户,大多数时间都是核心本身。

这就是为什么在之后访问用户init 被认为是安全的。

事实上,早期访问可能会破坏上运行的某些筛选器determine_current_user.

值得一提的是,它是一个“脆弱”的钩子,因为它有可能永远不会运行,只在可插入函数中触发。

但是,也有一些情况(如@toscho 如果你不能等到init,在这种情况下你别无选择。

解决任何不兼容的唯一方法是逐案解决,如果您愿意的话。

在大多数情况下(包括bbPress/BuddyPress)可能有效的解决方案是使用以下函数,而不是current_user_can:

function compat_current_user_can( $capability )
{
  if ( did_action( \'init\' ) ) {
     return current_user_can( $capability );
  }

  $user_id = apply_filters( \'determine_current_user\', false );

  return user_can( $user_id, $capability );
}
这允许在不设置全局用户的情况下尽早检查当前用户的能力,因此理论上可以在之前安全运行init.

问题是,如上所述,任何重写可插入函数而不触发的代码determine_current_user 打破它。

SO网友:bobbingwide

我倾向于认为BuddyPress和bbPress应该在发布_doing_it_wrong 消息

我更改了这两个例程,以检查$current\\u user的实际设置。

global $current_user; 
if ( is_null( $current_user ) ) {
    _doing_it_wrong( ... );
}
通知不再显示。

测试did_action( "after_setup_theme" ) 成为皮带的支撑。

结束

相关推荐

Configure Permissions in Mamp

我最近在Mamp上建立了一个网站,在上传到托管服务器时,我似乎失去了权限。我的猜测是,从本地到服务器的迁移带来了权限。你可以在这里看到http://162.213.156.137/~healthy/, 在页脚的左下方区域中,未加载图像。在我使用FTP手动更改权限之前,我还没有加载标题中的两个图像(小女孩和徽标)。我想知道是否有人以前处理过这个问题,并提出了建议,或者您是否知道如何从一开始就将MAMP配置为具有适当的设置。