Фильтрация комментариев (поиск)

В основном я хочу развить возможность поиска комментариев на моем сайте. Форма с полем ввода, в которой посетитель может ввести строку поиска, которая сообщает WP отображать только комментарии, содержащие эту поисковую фразу.

Я думаю, что лучший способ сделать это – создать пользовательскую функцию comments_template () , а затем отфильтровать комментарии, которые не содержат $_GET['search_phrase'] .

Любые указатели / предложения, особенно на части SQL , приветствуются 🙂

Вы создаете свой собственный comments_template , это может быть дублируемая функция по умолчанию, в любом случае единственными изменениями являются запросы к базе данных. Но вам нужна ваша собственная функция, поскольку WP не помогает вам с фильтрами здесь. SO, назовите его my_comments_template() :

  $filter = mysql_real_escape_string($_POST['comment-filter']); if(!empty($filter)) $filter = "AND (comment_content LIKE '%%{$filter}%%' OR comment_author LIKE '%%{$filter}%%')"; if($user_ID) $comments = $wpdb->get_results($wpdb->prepare("SELECT * FROM $wpdb->comments WHERE (comment_post_ID = %d) {$filter} AND (comment_approved = '1' OR (user_id = %d AND comment_approved = '0')) ORDER BY comment_date_gmt", $post->ID, $user_ID)); elseif(empty($comment_author)) $comments = $wpdb->get_results($wpdb->prepare("SELECT * FROM $wpdb->comments WHERE (comment_post_ID = %d) {$filter} AND (comment_approved = '1') ORDER BY comment_date_gmt", $post->ID)); else $comments = $wpdb->get_results($wpdb->prepare("SELECT * FROM $wpdb->comments WHERE (comment_post_ID = %d) {$filter} AND (comment_approved = '1' OR (comment_author = %s AND comment_author_email = %s AND comment_approved = '0')) ORDER BY comment_date_gmt", $post->ID, wp_specialchars_decode($comment_author, ENT_QUOTES), $comment_author_email)); 

затем добавьте простую форму в файл шаблона комментариев:

  <form action="<?php echo get_permalink(); ?>" method="post" id="comment-filter"> <input type="text" name="comment-filter" rel="<?php _e("Search in comments"); ?>" value="<?php echo esc_attr($_POST['comment-filter']); ?>" size="20" /> </form> 

и, конечно, замените все вызовы функций comments_template() с помощью my_comments_template()

Я внедряю этот код в тему, над которой я работаю. Мой код немного больше, поскольку я добавил подсветку ajax и запроса … Если вы хотите, чтобы все это дождалось выхода версии Atom на Atom 1.3.

Еще одна вещь, которую я еще не понял, – это сохранить $ _POST ['comment-filter'] при навигации по страницам комментариев. Напр. если вы ищете что-то внутри 5000 комментариев и получаете 1000 комментариев, содержащих этот текст и разбитых на страницах, при переключении страницы запрос фильтра комментариев теряется, и вы снова получаете 2000 комментариев …

Эта функция действительно полезна на сайтах WordPress, связанных с Tech, которые содержат сотни комментариев к сообщениям …

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

Мне пришлось реализовать аналогичную функциональность для проекта, над которым я работаю. Лучший способ – создать новую таблицу sql (или представление в таблице wp_comments) для хранения только данных комментариев, которые вы хотите вернуть в результатах поиска. Затем используйте эти недокументированные действия / фильтры для комментариев: comment_ {old status} до {new status} ('deleted', 'approved', 'unapproved', 'spam'), approve_comment, approved_comment (выполняется до и после утверждения комментария ), delete_comment, deleted_comments (запускаются до и после постоянного удаления комментария), trash_comment, trashed_comment (выполняется до и после удаления комментария) для обновления этой таблицы (так как вы не хотите, чтобы поиск по запросу, если он не был подтвержден или был отправлен спамом или уничтожены или удалены, не так ли?). Затем вы можете запускать поисковые запросы в этой настраиваемой таблице. Если вам нужны примеры для этих действий / фильтров, не стесняйтесь спрашивать меня!

Спасибо, rutwick