Comment filtering (search)

时间:2010-12-14 作者:Alex

基本上,我想发展在我的网站上搜索评论的能力。带有输入字段的表单,访问者可以在其中输入搜索字符串,该字符串告诉WP仅显示包含该搜索短语的注释。

我认为最好的方法是定制comments_template() 函数,然后筛选出不包含$_GET[\'search_phrase\'].

任何提示/建议,尤其是在SQL part 欢迎:)

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

您可以创建自己的comments_template, 它可以是默认函数的重复函数,但唯一的更改是数据库查询。但是您需要自己的功能,因为WP在这里不能帮助您使用过滤器。所以,说出它的名字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&;查询突出显示。。。如果您想看到这一切,请等待我的1.3版本Atom 主题

有一件事我还没有弄清楚,那就是在浏览评论页面时,如何保持$\\u POST[\'comment-filter\']。例如,如果你在5000条评论中搜索某个内容,得到1000条包含该文本的评论,并将其拆分为多个页面,当你切换页面时,评论过滤器查询将丢失,并再次显示2000条评论。。。

此功能在与技术相关的WordPress网站上非常有用,这些网站上有数百条帖子评论。。。

SO网友:Rutwick Gangurde

我知道在这里回答这个问题有点太长了,但希望将来有人会觉得这有帮助。

我必须为我正在进行的项目实现类似的功能。最好的方法是创建一个新的sql表(或wp\\U comments表上的视图),以便仅存储要在搜索结果中返回的注释数据。然后对注释使用这些未记录的操作/过滤器:comment_{old status}to{new status} (“已删除”、“已批准”、“未批准”、“垃圾邮件”),approve_comment, approved_comment (在批准评论之前和之后运行),delete_comment, deleted_comments (在永久删除注释之前和之后运行),trash_comment, trashed_comment(在删除评论之前和之后运行)来更新此表(因为如果某个评论未经批准或被垃圾邮件、被丢弃或删除,您不希望搜索它,是吗?)。然后可以在此自定义表上启动搜索查询。如果您需要这些操作/过滤器的示例,请随时询问我!

谢谢rutwick

结束