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