Accueil

Référence développeur · WordPress

Websource Méga-menu pour WordPress — référence développeur

Bloc, code court, fonction PHP, emplacements, routes REST, filtres, variables CSS et format des données de Websource Mega Menu.

Version 1.0.0 · WordPress 6.4+, WooCommerce 8+ (facultatif) · Mis à jour le 09/10/2026

Guide utilisateur

Cette extension existe aussi pour : PrestaShop

Vue d'ensemble

  • Espace de noms PHP : Websource\MegaMenu (classes dans src/, PSR-4, chargeur src/Autoloader.php).
  • Domaine de traduction : websource-megamenu (languages/).
  • Table : {prefix}wsx_megamenu (un menu par ligne, brouillon et version en ligne en JSON).
  • Options : wsx_megamenu_db_version, wsx_megamenu_cache_version.
  • Fichiers envoyés depuis l'éditeur : wp-content/uploads/websource-megamenu/.
  • Capacité requise pour l'administration et l'API : edit_theme_options.

Bloc

websource/megamenu — rendu côté serveur (blocks/menu/block.json, éditeur sans étape de build).

AttributTypeDéfautRôle
menustring""Identifiant ou nom du menu. Vide : tous les menus en ligne dont l'emplacement est « Je le place moi-même ».
alignstring—wide ou full (support natif).
classNamestring—Classe CSS supplémentaire (support natif).
<!-- wp:websource/megamenu {"menu":"2","align":"full"} /-->

Le bloc n'affiche rien sur le site si le menu n'est pas en ligne.

Code court

[websource_megamenu]

AttributDéfautRôle
menu""Identifiant ou nom du menu (insensible à la casse).
location""Clé d'emplacement : affiche les menus placés sur cet emplacement. Sans menu ni location : emplacement widget.
[websource_megamenu menu="2"]
[websource_megamenu menu="Pied de page"]
[websource_megamenu location="widget"]

Fonction PHP

websource_megamenu( int|string $menu = '', string $location = '' ): string

Renvoie le HTML du menu demandé (identifiant ou nom), sinon celui des menus placés sur $location. La feuille de style et le script sont mis en file d'attente par l'appel.

// Dans un gabarit de thème classique.
if ( function_exists( 'websource_megamenu' ) ) {
    echo websource_megamenu( 'Menu principal' ); // HTML déjà échappé par l'extension.
}

Emplacements

Réglage hook d'un menu.

CléAffichage
wp_body_openAction wp_body_open (haut de page).
header_navigationRemplace le premier bloc core/navigation du gabarit d'en-tête (zone header).
footer_navigationRemplace le premier bloc core/navigation du gabarit de pied de page (zone footer).
location:<slug>Remplace wp_nav_menu( [ 'theme_location' => '<slug>' ] ) (filtre pre_wp_nav_menu). Une clé par emplacement enregistré par le thème.
wp_footerAction wp_footer, priorité 5.
widgetAucun affichage automatique : bloc, code court ou fonction PHP.
nom d'une actionToute clé ajoutée par le filtre websource_megamenu_locations et qui est le nom d'une action : le menu est imprimé quand cette action s'exécute.

Routes REST

Espace de noms : websource-megamenu/v1. Toutes les routes exigent la capacité edit_theme_options (cookie + en-tête X-WP-Nonce, ou mot de passe d'application). Sans authentification : 401.

Les erreurs métier sont renvoyées sous la forme {"error":"message"} avec le code HTTP indiqué.

MéthodeCheminParamètresRéponse
GET/menus—{"menus":[{id,name,active,published,has_changes,location,updated}]}
POST/menusname, hook (clé d'emplacement), source : empty, example, nav:<id du menu classique> ou navpost:<id du wp_navigation>201 {"id":3,"url":"…"} ; 404 si la source n'existe pas
POST/menus/<id>/syncpayload (JSON : name, settings, tree), lang (code de langue de l'aperçu){"html":"…","saved_at":"18:05:25","has_changes":true} ; 404 si le menu n'existe pas
POST/menus/<id>/publish—{"ok":true}
POST/menus/<id>/discard—{"ok":true} (le brouillon reprend la version en ligne)
POST/menus/<id>/toggleactive (booléen){"ok":true}
POST/menus/<id>/duplicate—201 {"id":4,"url":"…"}
DELETE/menus/<id>—{"ok":true}
POST/menus/<id>/delete—{"ok":true} (équivalent pour les hébergements qui bloquent DELETE)
GET, POST/productsq (nom, référence ou identifiant){"products":[{"id":40,"name":"T-shirt Ardoise"}]}
POST/uploadfile (multipart ; JPG, PNG, WebP, GIF, AVIF ; 5 Mo){"url":"…"} ; 400 si refusé
POST/upload-iconfile (multipart ; SVG, PNG, JPG, WebP, GIF, AVIF ; 1 Mo){"url":"…"} ; 400 si refusé. Un SVG est réécrit par SvgSanitizer.
GET/export—Paquet JSON (voir plus bas)
POST/importdata (paquet JSON), mode : merge (défaut) ou replace, dry_run (booléen){"action":"merge","counts":{"create":1,"update":0,"delete":0,"skip":0},"messages":[]} ; 400 si le fichier n'est pas un export

Exemple de requête :

curl -u "admin:xxxx xxxx xxxx xxxx xxxx xxxx" \
  -X POST "https://exemple.fr/wp-json/websource-megamenu/v1/menus" \
  -d "name=Menu principal" -d "hook=widget" -d "source=example"

Exemple de réponse :

{"id":3,"url":"https://exemple.fr/wp-admin/themes.php?page=websource-megamenu&edit=3"}

Enregistrer un brouillon puis le publier :

curl -u "admin:xxxx…" -X POST "https://exemple.fr/wp-json/websource-megamenu/v1/menus/3/sync" \
  --data-urlencode 'payload={"name":"Menu principal","settings":{"hook":"widget","layout":"bar"},"tree":[{"type":"link","label":{"fr":"Contact"},"url":{"fr":"/contact"}}]}'
curl -u "admin:xxxx…" -X POST "https://exemple.fr/wp-json/websource-megamenu/v1/menus/3/publish"

Format des données

Réglages d'un menu (settings)

CléValeurs
hookClé d'emplacement (voir Emplacements).
layoutbar, columns.
themelight, dark, brand.
panelauto, content, full.
alignstart, center.
mobilepush, accordion.
aria_label{ "<code de langue>": "texte" }.
max_depthEntier de 2 à 6.

Élément de l'arbre (tree)

Chaque élément : id (3 à 24 caractères a-z0-9_, régénéré s'il manque), type, children (tableau), puis les champs du type. Les textes sont des tables { "<code de langue>": "texte" } ; les adresses libres acceptent une chaîne ou une table par langue.

TypeChamps propres
categoryid_category (terme product_cat), label, include_children, depth (1–3)
brandid_manufacturer (terme product_brand), label
brandslabel, limit (1–50)
productid_product, label
productssource (new, best, category, manual), id_category, ids, label, limit (1–20)
pagepage (home, blog, shop, new-products, best-sales, cart, checkout, my-account, login, privacy, terms), label
cms_pageid_cms (identifiant de page), label
cms_categoryid_cms_category (identifiant de la page parente), label
termid_term, label, include_children, depth
linklabel, url
grouplabel, url
promoimage, label, text, button_label, button_url, blank, visibility

Champs communs (sauf promo) : icon (clé de la bibliothèque, adresse d'image ou emoji), display (both, icon, text), icon_pos (before, after), icon_size (xs–xl), badge, badge_pos (float, inline), badge_variant (accent, brand, dark, light, success, danger, auto, custom), badge_bg, badge_fg (hex 3/4/6/8 chiffres ou rgb()/rgba()), badge_shape (pill, rounded, square), blank, nofollow, align (start, center, end), visibility (all, desktop, mobile).

Limites : 400 éléments par menu, 100 éléments par niveau, textes de 120 caractères (400 pour text), adresses de 500 caractères. Schémas d'adresse acceptés : http, https, mailto, tel, adresses relatives et ancres.

Paquet d'export

{
  "format": "websource-megamenu",
  "version": 1,
  "site": "https://exemple.fr/",
  "menus": [
    {
      "name": "Menu principal", "active": true, "published": true,
      "settings": {}, "tree": [], "settings_live": {}, "tree_live": []
    }
  ]
}

Dans un paquet, chaque élément relié à un contenu porte _refs : term:<taxonomie>:<slug> ou post:<type>:<chemin>. À l'import, ces références sont résolues sur le site d'arrivée ; une référence introuvable est signalée dans messages.

Filtres

FiltreParamètresRôle
websource_megamenu_locationsarray $hooks (clé => libellé)Ajouter ou retirer des emplacements. Une clé qui est le nom d'une action affiche le menu sur cette action.
websource_megamenu_node_typesarray $definitionsModifier le catalogue des types d'éléments.
websource_megamenu_sourcesSourceInterface[] $sourcesAjouter une source de données pour un type personnalisé.
websource_megamenu_shop_availablebool $availableForcer la disponibilité des types « boutique ».
websource_megamenu_brands_urlstring $url, string $languageAdresse de la page « toutes les marques » (vide par défaut : le titre n'est pas un lien).
websource_megamenu_resolved_treearray $tree, array $menuArbre prêt à afficher, juste avant le rendu.
websource_megamenu_json_ldbool $enabled, array $menuDésactiver les données structurées SiteNavigationElement.
websource_megamenu_htmlstring $html, string $menu, string $locationHTML final du ou des menus.
websource_megamenu_preview_headstring $head<head> du cadre d'aperçu de l'éditeur.
// Afficher les menus placés sur un hook du thème.
add_filter( 'websource_megamenu_locations', function ( $hooks ) {
    $hooks['mon_theme_sous_entete'] = 'Sous l\'en-tête de mon thème';
    return $hooks;
} );

Variables CSS

Le menu lit les variables du thème Websource sous la forme var(--wst-x, var(--color-x, repli)).

VariableRepliUsage
--wst-surface / --color-surface#fffFond du menu et des panneaux.
--wst-ink / --color-ink#14282bTexte ; fond du menu foncé et du tiroir.
--wst-line / --color-line#d9e6e4Filets et bordures.
--wst-brand-600 / --color-brand-600#0f766eCouleur d'accent, menu « couleur principale ».
--wst-brand-700 / --color-brand-700#0b5f58Dégradé du tiroir mobile.
--wst-brand-50 / --color-brand-50#effaf8Fond doux (survol, visuel).
--wst-brand-fill, --wst-brand-on#0f766e, #fffPastille « couleur principale ».
--wst-accent-fill, --wst-accent-600, --wst-accent-on#0f766e, #fffPastille « couleur d'accent ».
--wst-radius-xl / --radius-xl1remArrondi des languettes et visuels.
--wst-radius-2xl / --radius-2xl1.5remArrondi bas des grands panneaux.
--wst-container-max / --container-max80remLargeur maximale de la barre et des panneaux.
--wst-card-shadownoneOmbre des panneaux et visuels.

Variables internes, surchargeables sur .wsmm : --wsmm-bg, --wsmm-fg, --wsmm-line, --wsmm-accent, --wsmm-soft, --wsmm-pbg, --wsmm-max, --wsmm-bd-bg, --wsmm-bd-fg, --wsmm-push-w.

.wsmm { --wsmm-accent: #b45309; --wsmm-max: 72rem; }

Balisage et JavaScript

  • <nav class="wsmm wsmm--bar|wsmm--columns wsmm--theme-* …" aria-label="…">, listes ul.wsmm__list > li.wsmm__item, panneaux div.wsmm__panel, liens .wsmm__link, pastilles .wsmm__badge.
  • Boutons d'ouverture : button.wsmm__toggle (flèche à côté d'un lien) ou button.wsmm__trigger (titre sans lien), avec aria-expanded et aria-controls.
  • Point de bascule ordinateur / mobile : 992 px.
  • Script assets/js/menu.js (sans jQuery, defer, chargé seulement si un menu en barre est rendu). API : window.WSMegaMenu.init(root), .openNode(id), .openDrawer(), .closeDrawer().
  • Tout élément portant l'attribut data-wsmm-open ouvre le tiroir mobile du premier menu « push » de la page.

Classes PHP utiles

ClasseRôle
Plugin::instance()Services : display(), repository(), cache(), presenter(), createDefaultMenu().
Repository\MenuRepositoryall(), find(), create(), saveDraft(), publish(), discardDraft(), setActive(), delete(), findLive().
Cache\MenuCacheremember(), invalidate() (cache d'objets persistant si présent, sinon transients, 15 minutes).
Menu\TreeSanitizer, Menu\MenuSettings, Menu\FieldSanitizer, Menu\ColorSanitizer, Menu\SvgSanitizerNettoyage des données reçues.
Source\SourceInterfacetypes(): array, resolve( array $node, ResolveContext $context ): ?array (label, url, children).
Package\MenuPackageexport(), import().
// Vider le cache des menus après une opération maison.
Websource\MegaMenu\Plugin::instance()->cache()->invalidate();

Multilingue

  • Les textes sont enregistrés par code de langue (Polylang, WPML, sinon la langue du site).
  • Repli : langue du visiteur, puis langue par défaut traduite par la traduction de chaînes (Polylang : groupe « Websource Mega Menu » ; WPML : domaine websource-megamenu), puis premier texte disponible.
  • Les catégories, pages et produits sont remplacés par leur traduction (pll_get_post, pll_get_term, filtre wpml_object_id).
  • wpml-config.xml déclare le bloc et le code court comme n'ayant rien à traduire dans le contenu des pages.