CURRENT_USER_CAN()的临时功能

时间:2012-05-25 作者:onetrickpony

是否可以拦截对当前用户can()的调用?

示例:

current_user_can(\'rate\', $post_id)

没有注册“rate”功能,但我是否可以以某种方式连接到该功能并进行自己的检查,而不必注册角色功能?

1 个回复
最合适的回答,由SO网友:fuxia 整理而成

是的,只是过滤器\'user_has_cap\'. 您将获得一个具有当前功能的阵列,您可以在不接触数据库的情况下更改该阵列。

示例代码

add_filter( \'user_has_cap\', \'wpse_53230_catch_cap\', 10, 3 );

/**
 * See WP_User::has_cap() in wp-includes/capabilities.php
 *
 * @param  array  $allcaps Existing capabilities for the user
 * @param  string $caps    Capabilities provided by map_meta_cap()
 * @param  array  $args    Arguments for current_user_can()
 * @return array
 */
function wpse_53230_catch_cap( $allcaps, $caps, $args )
{

  // $args[2] is the post ID
  if($args[0] !== \'beat_chuck_norris\' || !isset($args[2]) || !my_checks($args[2]))
    return $allcaps;

  $allcaps[\'beat_chuck_norris\'] = 1;

  return $allcaps;
}


function my_checks($post_id){
  // here check if the current user can rate this post
  return true;
} 

测试

current_user_can( \'beat_chuck_norris\', get_the_ID() )
    and print \'The current user can beat Chuck Norris. Be nice to her!\';
处理超级管理员
add_filter(\'map_meta_cap\', \'wpse_53230_catch_cap_for_sa\', 10, 4);

function wpse_53230_catch_cap_for_sa($caps, $req_cap, $user_id, $args){

  if(is_multisite() 
      && is_super_admin($user_id)
      && ($req_cap === \'beat_chuck_norris\')
      && !empty($args[0]) // here post ID is $args[0]
      && !my_checks($args[0])
    ){
         $caps[] = \'do_not_allow\';
     }      

  return $caps;    
}

结束

相关推荐

PHP致命错误:无法为wp-includes/capabilities.php中的非对象调用重载函数

我在apache日志中遇到了太多以下错误。PHP Fatal error: Cannot call overloaded function for non-object in wp-includes/capabilities.php on line 1187这是函数current\\u user\\u can($capability)的内部,第1187行如下所示:$current_user = wp_get_current_user(); 我不知道问题出在哪里?