Vue d'ensemble
- Module
websourcefacetedsearch, espace de nomsWebsource\FacetedSearch\(PSR-4 danssrc/: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émenteProductSearchProviderInterfaceetFacetsRendererInterface, réutilise le paramètreq, les tris, la pagination et les objetsFacet,Filter,SortOrder,FacetCollection. Le fournisseur ne renvoie queid_product(etid_product_attributesi un attribut est filtré). - Il interroge les tables natives du catalogue ; il ne dépend pas des tables
layered_*deps_facetedsearch.
Hooks greffés
| Hook | Rôle |
|---|---|
productSearchProvider | Fournit le moteur de recherche des listes (le premier fournisseur gagne : placer le module avant ps_facetedsearch s'il reste actif). |
displayLeftColumn | Rendu du bloc de filtres (équivaut au widget). |
displayFooter | Éléments de fin de page nécessaires au bloc. |
actionFrontControllerSetMedia | views/css/front.css, views/js/front.js ; views/css/push.css seulement si un type de page utilise un volet. |
actionFrontControllerSetVariables | Balise robots et lien canonique des pages filtrées. |
actionWebsourceFacetedSearchFilterUrl | Ré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, actionWebsourceThemeImport | Participation 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êteX-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
nofollowpar filtre. La page revient à 1 quand un filtre change.
Tâches, cron et « pulse »
WebsourceFacetedSearch::runTasks(int $budget, bool $force = false, bool $full = false): arrayenchaîne : produits modifiés (filewsfs_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_tokendes 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ètrewsfs_action=tasks_run,tasks_status,preview,default_template… Indexation par lots de 100 produits (BATCH_SIZE).
Tables et configuration
| Élément | Contenu |
|---|---|
{prefix}wsfs_template | Modèles de filtres (par boutique). |
{prefix}wsfs_price | Index des prix. |
{prefix}wsfs_queue | Produits modifiés en attente. |
WSFS_SETTINGS | Réglages JSON (dont cron_token, pulse). |
WSFS_TASKS | État des tâches (dernières exécutions, erreurs, last_pulse). |
WSFS_LAST_INDEX, WSFS_CACHE_VERSION | Date 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.