是否可以过滤帖子中的评论,以便用户只能看到他们写的评论?


8

我对wordpress和编码还比较陌生,我正在一个网站上工作,在该网站上用户需要对某些帖子发表评论,但是我正在为其创建网站的人希望用户只能看到他们的评论。已为这些特定帖子撰写文章,没有其他用户的任何评论。

我已经搜索了一阵子了,但是找不到能够起作用的解决方案。有没有一种方法可以让我轻松实现呢?任何帮助将不胜感激。

谢谢!

Answers:


2

假设您的注释作者打算是注册用户,最简单的方法可能是使用pre_get_comments操作挂钩来修改WP_Comment_Query对象user_id查询var,以使查询仅返回当前用户的注释:

function wpse262203_restrict_comment_views( $comments_query ) {
  // Don't interfere with comment results in the dashboard
  if( is_admin() )
    return;

  $current_user = wp_get_current_user(); // Get the current user

  if( $current_user instanceof WP_User && is_user_logged_in() ) {
    // The visitor is logged in as a WordPress user...

    // If they're an administrator, don't filter the comments
    if( in_array( 'administrator', $current_user->roles ) )
      return;

    // Otherwise, restrict queried comments to those authored by this user.
    $comments_query->query_vars[ 'user_id' ] = $current_user->ID;
  }
  else {
    // The visitor isn't logged in - make sure no comments are queried.
    $comments_query->query_vars[ 'comment__in' ] = array(0);
  }
}

add_action( 'pre_get_comments', 'wpse262203_restrict_comment_views' );

除了检查用户角色以外,还可以使用current_user_can()/代替/除检查用户角色之外,还可以定制要筛选谁的注释。

尽管您还可以通过wp_get_current_commenter()结合使用author_email WP_Comment_Query参数来支持匿名评论,但这并不是绝对可靠或安全的。匿名评论者ID数据存储在cookie中,这意味着用户可以清除它或cookie可能过期-在这种情况下,用户将无法查看他们的评论,除非他们发表其他评论。凭据也很容易被欺骗-狡猾的访问者可能会访问其他用户的评论。


编辑-为什么以前不起作用

经过进一步调查,我先前尝试使用WP_Comment_Query::set()更改查询变量的尝试失败了,因为事实证明,WP_Comment_Query它实际上没有一种set()方法,与之相反WP_Query(请参见故障单#39120)。但是,它确实有一个__call()“魔术方法”,该方法拦截了对不存在的set()方法的调用并返回false,从而防止了PHP通常会抛出的错误并使我感到困惑。


您好Bosco,感谢您的快速回复。您正确地认为这将适用于注册用户。抱歉,我在原始帖子中没有澄清。因此,我不会搞砸这个代码,该代码放在哪里?在comments.php文件中?
基思·波考克

1
@KeithPocock这是一个“动作挂钩”-因此只要WordPress处理代码,它将在需要时执行。您可以将其粘贴到主题functions.php文件中,但是如果由第三方创建主题,则在主题更新时更改可能会被覆盖。放置它的最佳位置是在新插件中-按照“插件开发手册”“入门”部分(仅在页面的顶部)创建新的插件文件,然后将解决方案粘贴到我的答案下方标头信息。
bosco '17

嗨,博斯科,感谢您的澄清。我试图将其放置在functions.php文件中,但是在测试它时并没有过滤掉特定用户的注释(很可能是我做错了或不了解哈哈)。这次,我将其作为插件进行尝试,并将以任何结果返回。再次感谢!
基思·波考克

@KeithPocock糟糕!我在代码中发现了一个小错误-它应该可以在插件中使用,也可以在functions.php现在使用(尽管老实说,我还没有实际测试过Oo)。让我知道事情的后续!
bosco '17

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.