Можно ли отфильтровать комментарии в сообщении, чтобы пользователь мог видеть только те комментарии, которые он написал?

8

Я относительно новичок в WordPress и кодировании, и я работаю над сайтом, где пользователи должны будут оставлять комментарии к определенным сообщениям, но человек, для которого я создаю сайт, хочет, чтобы пользователь мог видеть только те комментарии, которые он написал для этих конкретных сообщений, а не каких-либо комментариев от других пользователей.

Я уже некоторое время искал, и не смог найти решение, которое, кажется, работает. Есть ли способ заставить это работать, достаточно простой для реализации? Любая помощь будет принята с благодарностью.

Спасибо!

Кит Покок
источник

Ответы:

2

Предполагая , что ваш комментарий авторов предназначены для пользователей, самый простой способ, вероятно , использовать pre_get_commentsдействие крюк , чтобы изменить WP_Comment_Queryобъект «сек user_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()вместо / в дополнение к проверке ролей пользователей, чтобы адаптировать, для кого фильтруются комментарии.

Хотя вы также можете поддерживать анонимное комментирование, используя wp_get_current_commenter()в сочетании с author_email WP_Comment_Queryаргументом, это не очень надежно или безопасно. Анонимные данные идентификатора комментатора хранятся в файлах 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
Привет Боско, спасибо за разъяснения. Я пытался поместить его в файл functions.php, но он не отфильтровывал комментарии для конкретного пользователя, когда я тестировал его (скорее всего, что-то я делаю неправильно или не понимаю, ха-ха). Я попробую это как плагин на этот раз, и отвечу в ответ с любыми результатами. Еще раз спасибо!
Кит Покок
@KeithPocock Ой! Я обнаружил небольшую ошибку в своем коде - он должен работать либо в плагине, либо functions.phpсейчас (хотя, честно говоря, я на самом деле не проверял его). Дайте мне знать, как это происходит!
Bosco