如果您以前检查过用户能力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
打破它。