[WordPress] Limiter la recherche aux titres des billets


Depuis quelques temps je cherche le moyen de rendre le moteur de recherche intégré dans WordPress plus pertinent. C’est assez insupportable de taper un mot clé et de se retrouver avec des billets qui n’ont pas grand chose à voir, simplement parce que le corps du texte contient ce mot (après vous me dire que si le mot y est, c’est que le billet est en rapport…).

L’une des méthodes pour y arriver est de limiter la recherche aux mots présents dans les titres des billets.

Pour ce faire, j’ai trouvé un bout de code très pratique sur WPSnipp, à ajouter comme d’habitude dans le fichier functions.php de votre thème :

function __search_by_title_only( $search, &$wp_query )  
  {  
      if ( emptyempty($search) )  
      return $search; // skip processing - no search term in query  
      $q =& $wp_query->query_vars;  
  
      // wp-includes/query.php line 2128 (version 3.1)  
      $n = !emptyempty($q['exact']) ? '' : '%';  
      $searchand = '';  
      foreach( (array) $q['search_terms'] as $term ) {  
      $term = esc_sql( like_escape( $term ) );  
      $search .= "{$searchand}($wpdb->posts.post_title LIKE '{$n}{$term}{$n}')";  
      $searchand = ' AND ';  
  }  
  $term = esc_sql( like_escape( $q['s'] ) );  
  if ( emptyempty($q['sentence']) && count($q['search_terms']) > 1 && $q['search_terms'][0] != $q['s'] )  
  $search .= " OR ($wpdb->posts.post_title LIKE '{$n}{$term}{$n}')";  
  if ( !emptyempty($search) ) {  
      $search = " AND ({$search}) ";  
      if ( !is_user_logged_in() )  
          $search .= " AND ($wpdb->posts.post_password = '') ";  
      }  
      return $search;  
  }  
add_filter( 'posts_search', '__search_by_title_only', 10, 2 );

Je ne l’ai pas encore passé en production car je cherche à l’améliorer pour y inclure les tags. De plus, je cherche à profiler la requête pour en vérifier les performances.

En tout cas, cela marche bien.