it-swarm.com.de

Kommentarfilterung (Suche)

Grundsätzlich möchte ich die Möglichkeit entwickeln, Kommentare auf meiner Website zu suchen. Ein Formular mit Eingabefeld, in das der Besucher eine Suchzeichenfolge eingeben kann, die WP anweist, nur Kommentare anzuzeigen, die diesen Suchbegriff enthalten.

Ich denke, der beste Weg, dies zu tun, ist, eine benutzerdefinierte comments_template () -Funktion zu erstellen und dann Kommentare herauszufiltern, die keinen $_GET['search_phrase'] enthalten.

Hinweise/Vorschläge, insbesondere zum SQL-Teil sind willkommen :)

2
Alex

Sie erstellen Ihren eigenen comments_template. Dies kann eine doppelte Funktion des Standardcodes sein. Die einzigen Änderungen sind ohnehin die Datenbankabfragen. Sie benötigen jedoch eine eigene Funktion, da WP Sie hier nicht mit Filtern unterstützt. Nennen Sie es 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));

fügen Sie dann ein einfaches Formular in die Kommentarvorlagendatei ein:

   <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>

und natürlich alle comments_template() Funktionsaufrufe durch my_comments_template() ersetzen

Ich implementiere diesen Code in ein Thema, an dem ich arbeite. Mein Code ist etwas größer, da ich Ajax & Query Highlighting hinzugefügt habe ... Wenn Sie alles sehen möchten, warten Sie auf die 1.3-Version meines Atom Thema.

Eine Sache, die ich noch nicht herausgefunden habe, ist, wie man $ _POST ['Kommentar-Filter'] beim Navigieren durch Kommentarseiten behält. Zum Beispiel. Wenn Sie innerhalb von 5000 Kommentaren nach etwas suchen und 1000 Kommentare erhalten, die diesen Text enthalten und in Seiten aufgeteilt sind, geht beim Wechseln der Seite die Abfrage für den Kommentarfilter verloren und es werden wieder 2000 Kommentare angezeigt ...

Diese Funktion ist sehr nützlich für WordPress-Websites mit technischen Aspekten, die Hunderte von Kommentaren zu Beiträgen enthalten ...

2
onetrickpony

Ich weiß, es ist ein bisschen zu lang, um hier zu antworten, aber ich hoffe, jemand findet das in Zukunft hilfreich.

Ich musste eine ähnliche Funktionalität für ein Projekt implementieren, an dem ich arbeite. Am besten erstellen Sie eine neue SQL-Tabelle (oder eine Ansicht der Tabelle wp_comments), in der nur die Kommentardaten gespeichert werden, die Sie in den Suchergebnissen zurückgeben möchten. Verwenden Sie dann diese undokumentierten Aktionen/Filter für Kommentare: comment_ {alter Status} bis {neuer Status} ('gelöscht', 'genehmigt', 'nicht genehmigt', 'Spam'), approve_comment, approved_comment (vor und nach der Genehmigung eines Kommentars ausführen), delete_comment, deleted_comments (vor und nach dem dauerhaften Löschen eines Kommentars ausführen), trash_comment, trashed_comment (wird vor und nach dem Löschen eines Kommentars ausgeführt), um diese Tabelle zu aktualisieren (da Sie nicht möchten, dass ein Kommentar durchsucht wird, wenn er nicht genehmigt oder als Spam versandt, verworfen oder gelöscht wurde, oder?). Dann können Sie Ihre Suchanfragen für diese benutzerdefinierte Tabelle auslösen. Wenn Sie Beispiele für diese Aktionen/Filter benötigen, können Sie mich gerne fragen!

Danke, Rutwick

0