web-dev-qa-db-fra.com

Filtrage des commentaires (recherche)

En gros, je souhaite développer la possibilité de rechercher des commentaires sur mon site. Un formulaire avec un champ de saisie dans lequel le visiteur peut entrer une chaîne de recherche, qui indique à WP d'afficher uniquement les commentaires contenant cette phrase de recherche.

Je pense que la meilleure façon de faire est de créer une fonction personnalisée comments_template () , puis de filtrer les commentaires qui ne contiennent pas $_GET['search_phrase'].

Tous les pointeurs/suggestions, en particulier sur la partie SQL sont les bienvenus :)

2
Alex

Vous créez votre propre comments_template, il peut s'agir d'une fonction dupliquée de celle par défaut, les seules modifications étant les requêtes de base de données. Mais vous avez besoin de votre propre fonction car WP ne vous aide pas avec les filtres ici. SO, nommez-le 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));

ajoutez ensuite un formulaire simple dans le fichier modèle de commentaires:

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

et bien sûr remplacer tous les appels de fonction comments_template() par my_comments_template()

J'implémente ce code dans un thème sur lequel je travaille. Mon code est un peu plus gros car j'ai ajouté ajax et la mise en surbrillance des requêtes ... Si vous voulez tout voir, attendez la version 1.3 de mon Atom thème.

Une chose que je n'ai pas encore comprise, c'est comment garder $ _POST ['comment-filter'] lorsque vous naviguez dans les pages de commentaires. Pour par exemple. si vous recherchez quelque chose dans 5000 commentaires et que vous obtenez 1000 commentaires contenant ce texte et décomposés en pages, lorsque vous changez de page, la requête de filtrage des commentaires est perdue et vous obtenez à nouveau 2000 commentaires ...

Cette fonction est vraiment utile sur les sites WordPress liés à la technologie qui contiennent des centaines de commentaires sur les publications.

2
onetrickpony

Je sais que c'est un peu long à répondre ici, mais j'espère que quelqu'un trouvera cela utile dans le futur.

J'ai dû implémenter une fonctionnalité similaire pour un projet sur lequel je travaille. Le meilleur moyen consiste à créer une nouvelle table SQL (ou une vue sur la table wp_comments) pour stocker uniquement les données de commentaire que vous souhaitez renvoyer dans les résultats de la recherche. Ensuite, utilisez ces actions/filtres non documentés pour les commentaires: comment_ {ancien statut} à {nouveau statut} ('supprimé', 'approuvé', 'non approuvé', 'spam'), approuver_comment, approuvé_comment (exécuté avant et après l'approbation d'un commentaire), delete_comment, delete_comments (exécuté avant et après la suppression définitive d'un commentaire), trash_comment, trashed_comment (s'exécute avant et après avoir supprimé un commentaire) pour mettre à jour ce tableau (car vous ne voudriez pas qu'un commentaire soit recherché s'il est non approuvé, spammé, supprimé ou supprimé, n'est-ce pas?). Ensuite, vous pouvez lancer vos requêtes de recherche sur cette table personnalisée. Si vous avez besoin d'exemples pour ces actions/filtres, n'hésitez pas à me demander!

Merci rutwick

0
Rutwick Gangurde