Devblog développement web, WordPress & WooCommerce

Modifier simplement et efficacement la recherche de WordPress

M

WordPress a beaucoup de qualités mais le moteur de recherche n’en fait pas vraiment partie. En effet, l’expression saisie par l’utilisateur est recherchée – par défaut – uniquement dans le titre ou le contenu de tous les articles, pages et post types du site.

Heureusement, comme toujours ou presque, un hook bien placé permet de corriger le tir, simplement et efficacement. Par exemple en étendant la recherche aux « postmeta » et aux « taxonomies » (catégories, tags etc..).

Pour activer cette recherche « avancée » sur votre WordPress, les quelques lignes suivantes sont à intégrer dans le fichier fonctions (functions.php) de votre thème.

add_filter('posts_where', 'advanced_search_query' );

function advanced_search_query( $where )
{
  if( is_search() ) {

    global $wpdb;
    $query = get_search_query();
    $query = like_escape( $query );

    // étendre la recherche aux postmeta
    $where .=" OR {$wpdb->posts}.ID IN (SELECT {$wpdb->postmeta}.post_id FROM {$wpdb->posts}, {$wpdb->postmeta} WHERE {$wpdb->postmeta}.meta_key = 'objectif' AND {$wpdb->postmeta}.meta_value LIKE '%$query%' AND {$wpdb->posts}.ID = {$wpdb->postmeta}.post_id)";

    // étendre la recherche aux taxonomies
    $where .=" OR {$wpdb->posts}.ID IN (SELECT {$wpdb->posts}.ID FROM {$wpdb->posts},{$wpdb->term_relationships},{$wpdb->terms} WHERE {$wpdb->posts}.ID = {$wpdb->term_relationships}.object_id AND {$wpdb->term_relationships}.term_taxonomy_id = {$wpdb->terms}.term_id AND {$wpdb->terms}.name LIKE '%$query%')";

    if(WP_DEBUG)var_dump($where);
    }
    return $where;
}

En pratique, cela permet par exemple d’afficher sur un site utilisant WooCommerce, tous les produits d’une même marque, même si le nom de la marque n’apparaît pas dans le contenu de la fiche produit.

Devblog développement web, WordPress & WooCommerce

Articles récents

Catégories