[WordPress] Limiter la recherche aux titres des articles (reloaded)


Je ne sais pas si vous avez remarqué, mais le moteur de recherche interne de WordPress n’est pas un modèle de pertinence. Vous recherchez un mot et il suffit que celui-ci se trouve n’importe où dans un billet, même si ce n’est pas l’objet principal de celui-ci, et il sort dans les résultats.

Pour améliorer la pertinence de la recherche de WordPress et être sûr que les termes sont en rapport avec les billets trouvés, il est possible de limiter la recherche aux titres des articles.

Pour ce faire, il suffit de coller le bout de code suivant de Paulund dans le fichier functions.php de votre thème.

function search_by_title_only( $search, &$wp_query )
{
    global $wpdb;
    if ( empty( $search ) )
        return $search; // skip processing - no search term in query
    $q = $wp_query->query_vars;
    $n = ! empty( $q['exact'] ) ? '' : '%';
    $search =
    $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 ';
    }
    if ( ! empty( $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', 500, 2 )

Relativement simple et efficace. un code très ressemblant à celui déjà publié précédemment, mais que je trouve un peu plus clair.