web-dev-qa-db-ja.com

ユーザーが自分が書いたコメントしか見ることができないように、投稿内のコメントをフィルタリングすることは可能ですか?

私は比較的ワードプレスやコーディングに慣れていません、そして私はユーザーが特定の投稿にコメントを残す必要があるサイトに取り組んでいます、しかし私がサイトを構築している人はユーザーにコメントを見ることができるだけです他のユーザーからのコメントではなく、これらの特定の投稿のために書いています。

私は今しばらく探し回っていて、うまくいくように見える解決策を見つけることができませんでした。私が実装するのに十分簡単な、これを機能させる方法はありますか?任意の助けは大歓迎です。

ありがとうございます。

8
Keith Pocock

あなたのコメントの作者が登録ユーザーであることを意図していると仮定すると、おそらく最も簡単な方法は pre_get_commentsアクション フックを使って WP_Comment_Query objectuser_idクエリ変数だけを返すようにすることです。現在のユーザーからのコメント:

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()を使用することもできます は、誰のコメントをフィルタ処理するかを調整するために使用します。

author_emailWP_Comment_Query引数と一緒に wp_get_current_commenter() を使用することで匿名コメントをサポートすることもできますが、これはそれほど信頼できないか安全ではありません。匿名のコメント投稿者IDデータはCookieに保存されます。つまり、ユーザーはそれを消去することができます。またはCookieが期限切れになる可能性があります。この場合、ユーザーは別の投稿までコメントを表示できません。資格情報もかなり簡単になりすまされます - 巧妙な訪問者は潜在的に他のユーザーからのコメントにアクセスする可能性があります。


編集 - これがうまくいかなかった理由

さらに調査した結果、以前のWP_Comment_Query::set()を使用してクエリ変数を変更しようとすると失敗していました。実はWP_Comment_Queryには、WP_Queryメソッドとは異なり、実際にはset()メソッドがありません( ticket#39120 を参照)。しかし、それは存在しない__call()メソッドへの呼び出しをインターセプトしてfalseを返していた set() "Magic Method" を持っているので、PHPが通常投げていたエラーを防ぎます。私を最後まで混乱させる。

2
bosco