Accueil

Référence développeur · PrestaShop

Websource Faceted Search pour PrestaShop — référence développeur

Fournisseur de recherche, hooks, widget, format des adresses filtrées, balises SEO, tâches et cron, tables et variables CSS du module Websource Faceted Search.

Version 1.2.0 · PrestaShop 1.7.7 à 9.x, PHP 7.1+, thème Websource Prestashop Theme (conseillé) · Mis à jour le 09/10/2026

Guide utilisateur

Cette extension existe aussi pour : WordPress

Vue d'ensemble

  • Module websourcefacetedsearch, espace de noms Websource\FacetedSearch\ (PSR-4 dans src/ : Admin, Engine, Facet, Filter, Hook, Index, Query, Search, Seo, Settings, Task, ThemePackage, Url).
  • Il se branche sur le contrat natif PrestaShop\PrestaShop\Core\Product\Search\* : il implémente ProductSearchProviderInterface et FacetsRendererInterface, réutilise le paramètre q, les tris, la pagination et les objets Facet, Filter, SortOrder, FacetCollection. Le fournisseur ne renvoie que id_product (et id_product_attribute si un attribut est filtré).
  • Il interroge les tables natives du catalogue ; il ne dépend pas des tables layered_* de ps_facetedsearch.

Hooks greffés

HookRôle
productSearchProviderFournit le moteur de recherche des listes (le premier fournisseur gagne : placer le module avant ps_facetedsearch s'il reste actif).
displayLeftColumnRendu du bloc de filtres (équivaut au widget).
displayFooterÉléments de fin de page nécessaires au bloc.
actionFrontControllerSetMediaviews/css/front.css, views/js/front.js ; views/css/push.css seulement si un type de page utilise un volet.
actionFrontControllerSetVariablesBalise robots et lien canonique des pages filtrées.
actionWebsourceFacetedSearchFilterUrlRépond à Websource Search Bar (voir ci-dessous).
Hooks d'invalidation (invalidationHooks())Mise à jour de l'index et vidage du cache quand le catalogue change.
actionWebsourceThemeExport, actionWebsourceThemeImportParticipation au paquet de thème.

Hook actionWebsourceFacetedSearchFilterUrl

Paramètres : filter (category, manufacturer ou brand), id, label, native_url, id_lang. Réponse : une adresse commençant par / ou http(s)://, ou une chaîne vide (l'appelant garde alors son lien natif). Pour une marque : la liste du catalogue avec la marque cochée, par exemple …?q=marques-acme, construite par le sérialiseur d'adresses du module à partir du modèle en vigueur.

Widget

{widget name='websourcefacetedsearch'}

La racine du bloc est toujours <div id="search_filters" class="wsfs wsfs-mode-<mode>"> ; les filtres actifs sont rendus dans #js-active-search-filters. Gabarits : views/templates/front/facets.tpl, _facet.tpl, _range.tpl, _chips.tpl, active-filters.tpl.

Modes d'affichage (Settings\DisplayMode) : sidebar, drawer, push-left, push-right, bar.

Mise à jour sans rechargement

front.js émet prestashop.emit('updateFacets', url). Le noyau demande l'adresse avec from-xhr ; le contrôleur de liste répond en JSON (rendered_facets, rendered_products, rendered_active_filters…) et le thème remplace #search_filters et #js-active-search-filters. Sans objet prestashop, le module applique lui-même cette réponse. Sans JavaScript, chaque valeur est un lien et les curseurs sont des formulaires GET.

Balisage d'un curseur (constaté) : <div class="wsfs-range" data-wsfs-range data-min data-max data-step data-sel-min data-sel-max data-mode="double" data-url="…q=prix-__MIN__-__MAX__/couleur-blanc">. Un filtre est un <details class="wsfs-details" data-wsfs-id="price"> avec <summary class="wsfs-label"> et .wsfs-body.

Adresses et SEO

  • Format natif : ?q=marques-acme/couleur-rouge/prix-10-50 ; libellés « slugifiés » ; l'ordre des filtres suit le modèle (une sélection = une seule adresse).
  • Page filtrée : <meta name="robots" content="noindex,follow">, en-tête X-Robots-Tag: noindex, follow, lien canonique vers la liste non filtrée (constaté sur …?id_category=2&controller=category&q=couleur-blanc).
  • Un filtre marqué « indexable » laisse la page indexable (canonique vers elle-même) tant que tous les filtres actifs le sont et que leur nombre ne dépasse pas la limite réglée.
  • Option nofollow par filtre. La page revient à 1 quand un filtre change.

Tâches, cron et « pulse »

  • WebsourceFacetedSearch::runTasks(int $budget, bool $force = false, bool $full = false): array enchaîne : produits modifiés (file wsfs_queue), réindexation complète, préchauffage du cache.
  • Cron : GET index.php?token=<jeton>&fc=module&module=websourcefacetedsearch&controller=cron[&budget=5..300][&force=1][&full=1]. Réponse JSON (rapport des tâches) ; jeton invalide : HTTP 403 {"error":"Jeton invalide."}. Le jeton (cron_token des réglages) est secret.
  • Sans cron : contrôleur pulse (réponse 204), appelé en arrière-plan par la boutique ; il exécute les tâches pendant 8 secondes au plus si l'option est active.
  • Back-office : contrôleur AdminWebsourceFacetedSearchAjax, paramètre wsfs_action = tasks_run, tasks_status, preview, default_template… Indexation par lots de 100 produits (BATCH_SIZE).

Tables et configuration

ÉlémentContenu
{prefix}wsfs_templateModèles de filtres (par boutique).
{prefix}wsfs_priceIndex des prix.
{prefix}wsfs_queueProduits modifiés en attente.
WSFS_SETTINGSRéglages JSON (dont cron_token, pulse).
WSFS_TASKSÉtat des tâches (dernières exécutions, erreurs, last_pulse).
WSFS_LAST_INDEX, WSFS_CACHE_VERSIONDate du dernier index, version du cache.

Cache : fichiers et APCu. Journal des requêtes lentes : var/logs/websourcefacetedsearch-slow.log.

Variables CSS

--wsfs-brand, --wsfs-brand-soft, --wsfs-ink, --wsfs-line, --wsfs-surface, --wsfs-r (arrondi), --wsfs-w (largeur du tiroir ou du volet), --wsfs-sbw (largeur de la barre de défilement compensée).

Méthodes publiques utiles

settings(), settingsRepository(), runTasks(), renderWidget($hookName, array $configuration): string.