仅显示对同一自定义用户角色的注释

时间:2016-08-25 作者:Zeki

有没有办法只显示特定用户角色对其相同用户角色的评论?

例如:登录用户属于“广告商”用户角色,他应该只看到他和他角色下的所有用户的评论。

非常感谢。

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

是的,你可以,

Frontend only

您需要检查每个帖子作者的角色。如果该评论作者的角色不是反对者,则将其从该帖子的评论列表中删除。

然后,如果当前登录的用户也是广告商角色的用户,则只能返回评论。

使用comments_array 过滤我们可以查看贴在帖子上的每条评论。但此过滤器应用于comments\\u模板,因此不会影响后端的access注释。

你可以这样做

add_filter( \'comments_array\' , \'wpse_filter_by_role_frontend\' , 10, 2 );
function wpse_filter_by_role_frontend( $comments, $post_id ){

  $current_user = wp_get_current_user(); // retrieve the currently logged in user

  // go over each comments for the current post
  foreach( $comments as $key => $comment ){

    $comment_author = new WP_User( $comment->user_id ); // for each comment get the author user object

    // here we say unset the current comment if the role of the comment author is not the same as the role of the logged in user
    if( $comment_author->roles[0] != $current_user->roles[0] ){
        unset( $comments[$key] );
    }

  }

  // Return the filtered $comments array 
  return $comments;


}

Frontend and backend

add_action( \'pre_get_comments\' , \'wpse_hide_for_backend\' );
function wpse_hide_for_backend( $comments_query ){

 // Hide all for non logged in users 
 if( !is_user_logged_in() ){
    return $comments_query->query_vars[\'comment__in\'] = array(0);
  }

  $current_user = wp_get_current_user();

  // if you don\'t want to apply restrictions to admins
  if( $current_user->roles[0] == \'administrator\' ){
    return $comments_query;
  }

  $user_ids = get_users( array( 
    \'role__in\' => $current_user->roles, 
    \'fields\' => \'ID\' 
  ) );

  $comments_query->query_vars[\'author__in\'] = $user_ids;

}

EDIT

我修改了第二个函数。

看到@birgire的回答,我意识到author_in 查询参数并使用get_users 带查询参数role__in 我们可以在前端和后端都达到预期的效果。

感谢@birgire的灵感:)

EDIT

要允许当前用户在获取评论时扮演更多角色(如添加管理员的评论),只需在role__in 具有所需的角色

因此函数将变成

add_action( \'pre_get_comments\' , \'wpse_hide_for_backend\' );
function wpse_hide_for_backend( $comments_query ){

 // Hide all for non logged in users 
 if( !is_user_logged_in() ){
    return $comments_query->query_vars[\'comment__in\'] = array(0);
  }

  $current_user = wp_get_current_user();

  // if you don\'t want to apply restrictions to admins
  if( $current_user->roles[0] == \'administrator\' ){
    return $comments_query;
  }

  $user_ids = get_users( array( 
    \'role__in\' => array(
      \'administrator\',
      $current_user->roles[0],
    ), 
    \'fields\' => \'ID\' 
  ) );

  $comments_query->query_vars[\'author__in\'] = $user_ids;

}
或者(为了便于在本论坛上阅读)

$permitted_roles = array(
  \'administrator\',
  $current_user->roles[0],
);

$user_ids = get_users( array( 
    \'role__in\' => $permitted_roles, 
    \'fields\' => \'ID\' 
  ) );

SO网友:birgire

这里有一种方法(未测试)可以显示与当前用户具有相同角色的用户的评论:

add_filter( \'comments_template_query_args\', function( array $args )
{   
    // Nothing to do for visitors
    if( ! is_user_logged_in() )
        return $args;

    // Nothing to do for threaded comments    
    if( isset( $args[\'hierarchical\'] ) && \'threaded\' === $args[\'hierarchical\'] )
        return $args;

    // Get current user
    $u = wp_get_current_user();

    // Nothing to do for users without any roles
    if( ! isset( $u->roles ) ||empty( $u->roles ) )
        return $args;

    // Fetch user ids with the same role
    $user_ids = get_users( [ \'role__in\' => (array) $u->roles, \'fields\' => \'ID\' ] );

    // Restrict comment authors
    if( ! empty( $user_ids ) )
        $args[\'author__in\'] = (array) $user_ids;

    return $args;

} );
在这里,我们假设用户基数不大,我们使用comments_template_query_args 筛选以在comments_template() 参与主题。