Vue d'ensemble
- Thème classique (gabarits PHP) avec
theme.jsonpour l'éditeur de blocs. - Espace de noms
Websource\Theme, classes danssrc/(chargeur PSR-4 maison dansfunctions.php). - Aucun bloc, aucun shortcode, aucune route REST, aucune table : le thème ne fait qu'afficher. Les éléments d'affichage (méga-menu, carrousel, réassurance…) sont fournis par les extensions Websource, qui se branchent sur les zones et les actions ci-dessous.
- Réglages enregistrés :
theme_modspréfixéswsx_uniquement.
| Classe | Rôle |
|---|---|
Theme | Supports, emplacements de menus, zones de widgets, classes de <body>. |
Settings | Réglages d'agencement (Personnaliser) + filtre websource_theme_settings. |
Tokens | Variables CSS + filtre websource_theme_tokens. |
Assets | Type de page, chargement du socle et du CSS de la page. |
Seo | Balises SEO et JSON-LD, effacement devant une extension SEO. |
Breadcrumb | Fil d'Ariane (visible + JSON-LD). |
Shop | Intégration WooCommerce (inerte sans WooCommerce). |
Customizer, Icons | Panneau de personnalisation, icônes SVG en ligne. |
Blocs et shortcodes
Le thème n'en déclare aucun. Il habille :
- les blocs du cœur (palette, tailles, boutons, citation, tableau :
theme.jsonetassets/src/wp-blocks.css) ; - les blocs Panier et Commande de WooCommerce (
assets/src/wc-blocks.css) ; - les shortcodes classiques
[woocommerce_cart],[woocommerce_checkout],[woocommerce_my_account],[products].
Variables CSS
Mêmes noms que le thème PrestaShop (assets/src/tokens.css). Les valeurs par défaut sont compilées dans assets/css/theme.css ; seules les valeurs modifiées sont imprimées dans <style id="websource-theme-inline-css">.
| Variable | Défaut | Rôle |
|---|---|---|
--color-brand-50 … --color-brand-900 | échelle Lagon, 600 = #0f766e | Couleur de marque. |
--color-brand, --color-brand-fill, --color-brand-on, --color-brand-text | #0f766e, #0f766e, #ffffff, #0b5f58 | Base, aplat, texte sur aplat, texte lisible sur fond de page. |
--color-secondary, -fill, -on, -text | #0b3a5c | Couleur secondaire. |
--color-accent, -fill, -on, -text | #f5b83d | Accent (étoiles, survol du pied de page). |
--color-accent-wst | #f0556b | Pastille de promotion, compteur du panier. |
--color-ink | #14282b | Texte. |
--color-line | #d9e6e4 | Bordures. |
--color-page, --color-surface | #ffffff | Fond de page, fond des cartes. |
--color-footer, --color-footer-ink, --color-footer-muted, --color-footer-deep, --color-footer-line, --color-footer-hover | #14282b… | Pied de page. |
--radius-xl, --radius-2xl | 1rem, 1.5rem | Arrondis des champs / boutons et des cartes. |
--font-sans, --font-head | pile système | Police du texte, police des titres. |
--container-page | 80rem | Largeur maximale du contenu. |
--wst-card-shadow | none | Ombre des cartes. |
--wst-muted | encre à 65 % | Texte secondaire. |
Alias courts, définis sur :root et acceptés par le filtre :
| Alias | Variable pilotée |
|---|---|
--wst-brand | --color-brand-600 (seul, il recalcule toute l'échelle 50–900) |
--wst-brand-light, --wst-brand-dark, --wst-brand-soft, --wst-brand-on | --color-brand-500, -700, -50, --color-brand-on |
--wst-secondary, --wst-accent, --wst-highlight | --color-secondary, --color-accent, --color-accent-wst |
--wst-ink, --wst-line, --wst-page, --wst-surface | --color-ink, --color-line, --color-page, --color-surface |
--wst-footer, --wst-footer-ink | --color-footer, --color-footer-ink |
--wst-radius, --wst-radius-lg | --radius-xl, --radius-2xl |
--wst-font, --wst-font-head, --wst-container | --font-sans, --font-head, --container-page |
Dans une extension, toujours prévoir un repli : color: var(--color-brand-600, #0f766e);.
Filtres
websource_theme_tokens
Point d'entrée de l'extension Websource Theme Config.
add_filter('websource_theme_tokens', function (array $tokens, array $defaults) {
$tokens['--wst-brand'] = '#7c3aed'; // recalcule --color-brand-50 … 900, -on, -text
$tokens['--radius-xl'] = '.5rem';
$tokens['--wst-card-shadow'] = '0 6px 18px rgba(0,0,0,.12)';
$tokens['--mon-extension-couleur'] = '#123456'; // toute variable --… est imprimée telle quelle
return $tokens;
}, 10, 2);
Résultat dans la page :
<style id="websource-theme-inline-css">
:root{--color-brand-50:#f6f1fe;…;--color-brand-600:#7c3aed;…;--radius-xl:.5rem;--wst-card-shadow:0 6px 18px rgba(0,0,0,.12);--wst-brand:#7c3aed;--mon-extension-couleur:#123456;}
</style>
Les noms doivent commencer par -- ; une valeur contenant {, }, <, >, ; ou \ est ignorée.
websource_theme_settings
add_filter('websource_theme_settings', function (array $s) {
$s['header_desktop'] = 'centered'; // classic | centered | compact
$s['header_mobile'] = 'icons_right'; // icons_right | centered | stacked
$s['mobile_nav'] = 'bottom'; // bottom | top
$s['footer_style'] = 'dark'; // dark | light
$s['product_layout'] = 'classic'; // classic | xl | showcase | minimal | sticky-buy | magazine
$s['product_details'] = 'tabs'; // tabs | accordion | stacked
$s['shop_sidebar'] = 'left'; // left | none
$s['shop_columns'] = '3'; // 3 | 4
return $s;
});
Clés supplémentaires : primary_color, footer_text, copyright. Une valeur inconnue revient au défaut.
Autres filtres
| Filtre | Paramètres | Rôle |
|---|---|---|
websource_theme_product_layout | array $layout, int $product_id | preset, details_mode, hidden (blocs masqués parmi flags, gallery, title, price, short_description, buy, meta, reassurance, details, related). Permet une disposition par produit. |
websource_theme_page_type | string $type | Type de page : home, shop, product, cart, checkout, account, post, blog, page, search, 404. |
websource_theme_page_styles | array $files, string $type | Feuilles de style de la page (suffixe => chemin relatif au thème). |
websource_theme_keep_woocommerce_css | bool (défaut false) | true : garde les feuilles de style d'origine de WooCommerce. |
websource_theme_seo_enabled | bool $enabled, string $plugin | Force ou coupe l'en-tête SEO du thème. |
websource_theme_canonical, websource_theme_description, websource_theme_robots | string | Valeur de la balise. |
websource_theme_alternates | array (hreflang => url) | Balises hreflang. |
websource_theme_open_graph | array (propriété => contenu) | Balises Open Graph. |
websource_theme_jsonld | array (clés organization, website, webpage, breadcrumb, itemlist, article) | Nœuds JSON-LD ; retirer une clé supprime le nœud. |
websource_theme_breadcrumb | array de ['title' => …, 'url' => …] | Fil d'Ariane. |
websource_theme_product_flags | array $flags, WC_Product $product | Pastilles (type, label). |
websource_theme_new_days | int (défaut 20) | Durée de la pastille « Nouveau », en jours. |
websource_theme_home_sections | array $sections, bool $has_content | Sections automatiques de l'accueil : hero, new_products, categories, sale_products, posts. |
websource_theme_tabbar_items | array | Entrées de la barre du bas (url, icon, label, current). |
websource_theme_search_form | string $html, string $suffix | Formulaire de recherche de l'en-tête. |
websource_theme_copyright | string | Ligne de copyright. |
Actions et zones
Chaque zone exécute d'abord l'action websource_theme_area_<id> (tirets remplacés par des soulignés), puis affiche les widgets de la zone wsx-<id>. Une zone vide n'écrit aucun balisage.
Zone (id) | Action | Hook PrestaShop |
|---|---|---|
banner | websource_theme_area_banner | displayBanner |
topbar-left | websource_theme_area_topbar_left | displayNav1 |
topbar-right | websource_theme_area_topbar_right | displayNav2, displayWebsourceTopbarRight |
header-search | websource_theme_area_header_search | displayTop |
header-menu | websource_theme_area_header_menu | displayNavFullWidth |
wrapper-top | websource_theme_area_wrapper_top | displayWrapperTop |
home | websource_theme_area_home | displayHome |
shop-sidebar | websource_theme_area_shop_sidebar | displayLeftColumn |
sidebar | websource_theme_area_sidebar | displayRightColumn |
product-reassurance | websource_theme_area_product_reassurance | displayReassurance |
product-footer | websource_theme_area_product_footer | displayFooterProduct |
cart-footer | websource_theme_area_cart_footer | displayShoppingCartFooter |
wrapper-bottom | websource_theme_area_wrapper_bottom | displayWrapperBottom |
footer-before | websource_theme_area_footer_before | displayFooterBefore |
footer-1, footer-2, footer-3 | websource_theme_area_footer_1 … | displayFooter |
footer-after | websource_theme_area_footer_after | displayFooterAfter |
Exemple : remplacer le menu principal par un méga-menu.
add_action('websource_theme_area_header_menu', function () {
echo do_shortcode('[mon_mega_menu]');
});
Autres actions :
| Action | Emplacement |
|---|---|
websource_theme_header_actions | Actions de l'en-tête (ordinateur). Dès qu'un rappel y est accroché, les liens Compte et Panier par défaut ne sont plus affichés. |
websource_theme_drawer | Bas du panneau de menu mobile. |
websource_theme_footer_about | Première colonne du pied de page, sous le texte de présentation (avis, réseaux sociaux). |
websource_theme_product_top (WC_Product $product) | Zone haute de la fiche produit ; envelopper la sortie dans un élément .wsx-pb. |
Emplacements de menus : primary, topbar, footer, legal.
Classes posées sur <body> : wsx, wsx-dh-{classic|centered|compact}, wsx-mh-{icons_right|centered|stacked}, wsx-mn-{bottom|top}, wsx-ft-{dark|light}, wsx-page-<type>.
Fonctions publiques
Toutes surchargeables dans un thème enfant (function_exists).
| Fonction | Retour |
|---|---|
websource_theme_get_area(string $id): string | HTML d'une zone (action + widgets). |
websource_theme_area(string $id, string $before = '', string $after = ''): bool | Affiche la zone entre deux balises, rien si elle est vide. |
websource_theme_icon(string $name, int $size = 24): string | Icône SVG : menu, search, account, cart, home, star, mail, close, filter, orders, downloads, address, payment, logout, dashboard, check, chevron. |
websource_theme_breadcrumb(): void | Affiche le fil d'Ariane. |
websource_theme_cart_count(): int, websource_theme_cart_badge(): string | Nombre d'articles, pastille du panier. |
websource_theme_account_url(): string, websource_theme_cart_url(): string | Adresses du compte et du panier. |
websource_theme_logo(): string | Logo ou nom du site. |
websource_theme_search_form(string $suffix = 'header'): string | Formulaire de recherche. |
websource_theme_pagination(): void | Pagination des listes. |
websource_theme_setting(string $key): string | Valeur d'un réglage. |
Routes REST
Le thème ne déclare aucune route. Le compteur du panier lit la route publique de WooCommerce :
GET /wp-json/wc/store/v1/cart
{ "items_count": 3, "items": [ … ], "totals": { … } }
assets/js/theme.js met à jour tous les éléments [data-wsx-cart-count] après les évènements added_to_cart, removed_from_cart, updated_cart_totals (scripts classiques) et wc-blocks_added_to_cart, wc-blocks_removed_from_cart (blocs). Les ajouts AJAX classiques passent aussi par le fragment span.wsx-cart-count.
En-tête SEO
Imprimé par Seo::head() et Seo::jsonLd() : meta description, meta robots (noindex,follow sur la recherche, le panier, la commande, le compte et les listes triées), canonical, hreflang + x-default (Polylang, WPML), rel=prev/next, Open Graph (product:price:* sur une fiche produit), twitter:card, JSON-LD Organization, WebSite (accueil), WebPage / CollectionPage / SearchResultsPage / ContactPage / AboutPage, BreadcrumbList, ItemList (listes de produits), BlogPosting. Le nœud Product reste celui de WooCommerce (@id = <permalien>#product), référencé par mainEntity.
Le thème n'imprime rien si l'une de ces constantes existe : WPSEO_VERSION, RANK_MATH_VERSION, SEOPRESS_VERSION, AIOSEO_VERSION, THE_SEO_FRAMEWORK_VERSION, SLIM_SEO_VER.
Gabarits WooCommerce surchargés
| Fichier | Version d'origine | Rôle |
|---|---|---|
woocommerce/content-product.php | 9.4.0 | Carte produit (.wsx-pm). |
woocommerce/content-single-product.php | 3.6.0 | Fiche produit en zones .wsx-pz--top/media/info/below. |
woocommerce/single-product/tabs/tabs.php | 10.1.0 | Détails en onglets / accordéon / sections. |
woocommerce/cart/cart-empty.php | 9.4.0 | Panier vide. |
woocommerce/checkout/form-checkout.php | 9.4.0 | Commande en deux colonnes. |
woocommerce/checkout/thankyou.php | 8.1.0 | Confirmation de commande. |
woocommerce/myaccount/navigation.php | 9.3.0 | Navigation du compte avec icônes. |
woocommerce/myaccount/dashboard.php | 4.4.0 | Tableau de bord en cartes. |
Tous les hooks d'origine sont conservés, dans le même ordre. Blocs de la fiche produit : .wsx-pb--flags, --gallery, --title, --price, --short-description, --buy, --reassurance, --meta, --details, --related.
Build CSS
npm install
npm run build # assets/css/theme.css + assets/css/pages/<type>.css + assets/css/editor.css
npm run watch
- Sources :
assets/src/; correspondance page → sources et gabarits :scripts/pages.config.mjs. - Tailwind v4 ne scanne que les gabarits de la page ; tout ce qui est déjà dans
theme.cssest retiré des fichiers de page. - Le CSS des composants est hors couche (
@layer) pour primer sur le CSS du cœur, de WooCommerce et des extensions ; seuls la remise à zéro et les utilitaires Tailwind sont en couches. - Ajouter un type de page : une entrée dans
pages.config.mjs, puis renvoyer ce type avecwebsource_theme_page_type.