web-dev-qa-db-ja.com

コメントフィルタリング(検索)

基本的に私は自分のサイト上でコメントを検索する機能を開発したいです。訪問者が検索文字列を入力できる入力フィールドを持つフォーム。この検索フレーズを含むコメントのみを表示するようにWPに指示します。

これを行う最良の方法は、カスタム comments_template() 関数を作成してから、$_GET['search_phrase']を含まないコメントを除外することです。

特に SQLの部分 についてのポインタ/提案は大歓迎です:)

2
Alex

あなたはあなた自身の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とクエリの強調表示を追加したのでもう少し大きくなります...それをすべて見たい場合は、私の Atom themeの1.3リリースを待ってください。

私がまだ理解していないことの1つは、コメントページをナビゲートするときに$ _POST ['comment-filter']を維持する方法です。例えば。 5000コメント内の何かを検索し、そのテキストを含み1000ページのコメントがページに分割されると、ページを切り替えるとコメントフィルタクエリが失われ、2000のコメントが再び表示されます。

この機能は、投稿に何百ものコメントがあるTech関連のWordPressサイトで本当に役に立ちます...

2
onetrickpony

ここで答えるのは少し長すぎることを私は知っていますが、誰かが将来これが参考になることを願っています。

私が取り組んでいるプロジェクトにも同じような機能を実装しなければなりませんでした。最善の方法は、検索結果に返したいコメントデータのみを格納するための新しいsqlテーブル(またはwp_commentsテーブルのビュー)を作成することです。それから、コメントのためにこれらの文書化されていないアクション/フィルタを使ってください:comment_ {古いステータス}から{新しいステータス} ( '削除'、 '承認済み'、 '未承認'、 'スパム')、approve_comment、updated_comment(コメントの承認前後に実行)、 delete_comment、deleted_comments(コメントの永久削除の前後に実行)、trash_comment、trashed_comment(コメントをゴミ箱に入れる前後に実行して)このテーブルを更新します(承認されていない、スパムされている、またはゴミ箱に入れられているか削除されたコメントは検索したくないでしょう)その後、このカスタムテーブルで検索クエリを起動できます。これらのアクション/フィルタの例が必要な場合は、遠慮なく私に聞いてください。

ありがとう、ラトウィック

0