Le WordPress d'aujourd'hui, décodé pour les développeurs

E-commerce

Indexer un catalogue WooCommerce dans Typesense sans extension tierce

Un moteur de recherche produit rapide, auto-hébergé, sans extension fragile ni service payant récurrent. Tutoriel pas à pas pour brancher Typesense sur un catalogue WooCommerce.

Par WordPress Développement • 8 avril 2024 • 4 min de lecture • Aucun commentaire
Indexer un catalogue WooCommerce dans Typesense sans extension tierce

wp eval 'echo count( wc_get_products( array( "limit" => -1, "return" => "ids" ) ) );' — cette commande donne en une ligne le nombre de produits à indexer avant de se lancer dans un moteur de recherche dédié. Au-delà de quelques centaines de références, la recherche native de WordPress, basée sur des requêtes LIKE en base MySQL, montre vite ses limites : pas de tolérance aux fautes de frappe, pas de pertinence par pondération de champs, et des temps de réponse qui se dégradent avec le catalogue.

Typesense est un moteur de recherche open source, auto-hébergeable, pensé pour être simple à opérer par rapport à Elasticsearch. Ce tutoriel construit une indexation complète d’un catalogue WooCommerce sans passer par une extension tierce, avec un script d’export et une requête de recherche côté frontend. Il ne traite pas l’indexation des articles de blog, qui suivrait une logique différente avec ses propres champs.

Installer Typesense et créer la collection

Typesense se déploie facilement via Docker sur le même serveur que WordPress ou sur un serveur dédié léger. Une fois le conteneur lancé, la première étape consiste à définir le schéma de la collection qui va recevoir les produits, avec les champs sur lesquels la recherche et le filtrage doivent porter :

curl -X POST 'http://localhost:8108/collections' \
  -H 'X-TYPESENSE-API-KEY: cle_api_secrete' \
  -H 'Content-Type: application/json' \
  -d '{
    "name": "produits_boutique",
    "fields": [
      { "name": "nom", "type": "string" },
      { "name": "description", "type": "string" },
      { "name": "prix", "type": "float", "facet": true },
      { "name": "categorie", "type": "string", "facet": true }
    ],
    "default_sorting_field": "prix"
  }'

Exporter le catalogue WooCommerce vers Typesense

L'essentiel à retenir : Typesense s'installe en quelques minutes et s'auto-héberge facilement ; Un script d'indexation basé sur wc_get_products suffit, sans extension ; La recherche côté frontend passe par une requête HTTP simple vers l'API

L’export s’appuie uniquement sur des fonctions natives de WooCommerce, sans dépendance à une extension d’indexation. Un script exécutable via wp eval-file parcourt les produits publiés, construit un document par produit et l’envoie à l’API Typesense :

$produits = wc_get_products( array(
    'limit'  => -1,
    'status' => 'publish',
) );

$documents = array();

foreach ( $produits as $produit ) {
    $documents[] = array(
        'id'         => (string) $produit->get_id(),
        'nom'        => $produit->get_name(),
        'description'=> wp_strip_all_tags( $produit->get_short_description() ),
        'prix'       => (float) $produit->get_price(),
        'categorie'  => implode( ', ', wp_get_post_terms( $produit->get_id(), 'product_cat', array( 'fields' => 'names' ) ) ),
    );
}

$corps = implode( "\n", array_map( 'wp_json_encode', $documents ) );

wp_remote_post( 'http://localhost:8108/collections/produits_boutique/documents/import?action=upsert', array(
    'headers' => array( 'X-TYPESENSE-API-KEY' => 'cle_api_secrete' ),
    'body'    => $corps,
) );

Ce script tourne en tâche planifiée, via une entrée cron système appelant WP-CLI, plutôt que sur chaque sauvegarde de produit : une synchronisation toutes les quinze minutes suffit pour la plupart des boutiques, sans surcharger le serveur Typesense à chaque modification mineure.

Garder la fraîcheur pour les changements de stock

Pour les changements critiques comme une rupture de stock, un hook ciblé complète l’export planifié en mettant à jour un seul document, sans réindexer tout le catalogue :

add_action( 'woocommerce_product_set_stock_status', function( $product_id, $status ) {
    wp_remote_request( "http://localhost:8108/collections/produits_boutique/documents/{$product_id}", array(
        'method' => 'PATCH',
        'headers'=> array( 'X-TYPESENSE-API-KEY' => 'cle_api_secrete' ),
        'body'   => wp_json_encode( array( 'en_stock' => 'instock' === $status ) ),
    ) );
}, 10, 2 );

Brancher la recherche côté frontend

Côté site public, un champ de recherche envoie une requête directe à l’API Typesense au fil de la frappe, en JavaScript, sans passer par le serveur WordPress à chaque caractère saisi. La recherche query_by peut pondérer plusieurs champs, avec une priorité plus forte sur le nom du produit que sur sa description :

GET /collections/produits_boutique/documents/search
    ?q=chaise+bois
    &query;_by=nom,description
    &query;_by_weights=3,1

Cette architecture décharge complètement MySQL de la charge de recherche, ce qui se ressent particulièrement pendant les pics de trafic où la base de données WordPress est déjà sollicitée par ailleurs.

  • Aucune dépendance à un service tiers payant : Typesense reste entièrement auto-hébergé.
  • La synchronisation planifiée limite la charge sur le serveur applicatif.
  • Le hook ciblé sur le stock garde les résultats de recherche cohérents avec la disponibilité réelle.

Testez toujours la recherche avec des fautes de frappe volontaires avant la mise en production : c’est la tolérance native de Typesense aux erreurs qui justifie souvent son adoption face à une simple requête SQL.

Pour aller plus loin

Cette base peut évoluer vers des facettes de filtrage par catégorie et par tranche de prix, directement exposées par l’API de recherche de Typesense sans code supplémentaire côté WordPress. Le vrai gain, au-delà de la vitesse, reste l’indépendance vis-à-vis d’un service tiers facturé à l’usage : le catalogue reste maître de sa propre infrastructure de recherche, tout en profitant d’un moteur bien plus performant que la recherche native.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Partager :

À propos de l'auteur

WordPress Développement

Développeur WordPress, passionné par Elementor, le FSE et l’automatisation par IA.

Voir tous ses articles

Dans la même veine

À lire aussi