Accueil

Référence développeur · WordPress

Websource Store Info pour WordPress — référence développeur

Bloc, code court, fonctions PHP, filtres, actions, routes REST, format des données et d'export, variables CSS de l'extension Websource Store Info.

Version 1.3.0 · WordPress 6.4+, WooCommerce 8+ (facultatif), PHP 7.4 à 8.5 · Mis à jour le 09/10/2026

Guide utilisateur

Cette extension existe aussi pour : PrestaShop

Vue d'ensemble

  • Espace de noms Websource\StoreInfo, classes dans src/ (chargeur PSR-4 maison, pas de Composer).
  • Capacité requise pour l'administration et toutes les routes REST : manage_options (filtre websource_storeinfo_capability).
  • Fonctionne sans WooCommerce. Les emplacements « fiche produit » et « panier » s'appuient sur ses hooks.
  • CSS (wsx-storeinfo) et JavaScript (wsx-storeinfo, différé, sans dépendance) chargés seulement quand un bloc est rendu.
  • Aucun appel externe côté serveur, sauf le téléchargement d'une photo lors d'un import (adresses publiques seulement, download_url).
ClasseRôle
PluginAmorçage, services, rendu, code court, bloc, JSON-LD, section de paquet de thème.
Hours\*Logique d'horaires sans dépendance : HoursParser, WeeklySchedule, Season, ClosureException, OpeningSchedule, OpeningCalculator, OpeningStatus, StatusPresenter, Labels, DayMath, TimeRange, ParsedDay.
Store\StoreRepository, StoreSanitizer, StoreSelector, ScheduleFactory, StoreViewBuilder, ViewContextStockage, assainissement, choix des magasins, préparation de la vue.
Settings\Settings, SettingsStore, PlacementCatalog, PageDetectorRéglages, emplacements, type de page.
Render\StoreRenderer, DesignStyle, Contrast, EmailObfuscator, SchemaOrgBuilderRendu, variables CSS, contraste, e-mail encodé, JSON-LD.
Directions\DirectionsBuilderLiens d'itinéraire et adresse de la carte.
Front\DispatcherEmplacements automatiques (thèmes à blocs et classiques).
Rest\RestController, Admin\AdminPage, ThemePackage\ThemePackageREST, écran Infos magasin, export / import.

php tests/run.php exécute 48 vérifications de la logique d'horaires sans WordPress (plages multiples, minuit, jours fériés, fuseaux, changement d'heure, saisons).

Données

OptionContenu
wsx_storeinfo_storesListe de magasins : id, slug, position, active, content. 50 au plus.
wsx_storeinfo_next_idProchain numéro de magasin.
wsx_storeinfo_settingsRéglages généraux.
wsx_storeinfo_placementsEmplacements (30 au plus).

Contenu d'un magasin

CléFormat
nameTexte, 120 caractères, obligatoire.
descriptionTexte multiligne, 1 500 caractères.
noteTexte, 300 caractères.
address1, address2, postcode, city, countryTextes.
country_isoDeux lettres majuscules.
phoneTexte, 30 caractères.
emailAdresse valide ou vide.
latitude, longitudeDécimal en texte, 6 décimales, ou vide.
image_idIdentifiant d'une image de la médiathèque, ou 0.
hoursObjet 1 (lundi) à 7 (dimanche) : texte saisi, 80 caractères.
seasons6 au plus : label, from et to (MM-JJ), hours.
exceptions60 au plus : label, from et to (AAAA-MM-JJ), hours (vide = fermé).

Réglages

CléTypeDéfaut
main_storeentier0 (premier magasin actif)
multi_displaymain ou listmain
schemabooléentrue
mapbooléentrue
providersliste parmi google, waze, apple, osmles quatre
showobjet de booléens : photo, description, phone, email, hours, directionstous true
follow_themebooléentrue
designbg, title_color (#rrggbb ou vide), borders, radius (none, sm, md, lg), width (box, wide)
contact_pageidentifiant de page, 0 = page /contact0
keep_databooléentrue

Emplacement

CléValeurs
positionheader_bar, under_header, footer_col, before_footer, contact_page, home, product_pickup, cart, custom
pageall, home, shop, category, product, cms, blog, contact, cart, checkout, account (imposé pour contact_page, home, product_pickup, cart)
hookNom d'action WordPress, pour custom seulement. Les actions d'en-tête et d'administration sont refusées.
layoutcompact, card, footer
storemain, all ou un numéro de magasin
titleTexte, 80 caractères

Bloc Gutenberg websource/storeinfo

Rendu serveur (block.json, apiVersion 3, éditeur sans build). Catégorie Widgets. Alignements large et pleine largeur.

AttributTypeDéfautRôle
storechaînemainmain, all, numéro ou identifiant court du magasin.
layoutchaînecardcompact, card ou footer.
titlechaîneTitre du bloc.
alignchaînewide ou full.
classNamechaîneClasses CSS supplémentaires.
<!-- wp:websource/storeinfo {"store":"main","layout":"card","title":"Notre magasin"} /-->

Code court [websource_storeinfo]

AttributDéfautRôle
storemainmain, all, numéro ou identifiant court.
layoutcardcompact, card ou footer.
titleTitre du bloc.
classClasses CSS supplémentaires.
[websource_storeinfo store="magasin-de-demonstration" layout="compact"]

Un magasin inconnu ou masqué ne produit aucune sortie.

Fonctions publiques

// HTML du bloc. $store : 'main', 'all', numéro ou identifiant court. $layout : compact|card|footer.
echo websource_storeinfo_render('main', 'card', 'Notre magasin');

// État d'ouverture dans le fuseau du site, ou null si le magasin n'existe pas.
$status = websource_storeinfo_status('main');
// ['state' => 'closed', 'text' => 'Fermé – ouvre demain à 9h']  (state : open|closing|closed|unknown)

Emplacements automatiques

PositionThème à blocsThème classique
header_barAvant la partie de modèle de l'en-tête.Action wp_body_open.
under_headerAprès la partie de modèle de l'en-tête.Actions connues de thèmes (filtre websource_storeinfo_position_hooks) ; sinon aucune sortie.
footer_colAvant </footer> de la partie de modèle.Actions connues de thèmes ; sinon wp_footer, sous le pied de page.
before_footerAvant la partie de modèle du pied de page.Action get_footer.
contact_pageFiltre the_content de la page de contact.Idem.
homeAvant </main> sur l'accueil.loop_end de la requête principale ou woocommerce_after_main_content.
product_pickupAprès le bloc d'ajout au panier, ou woocommerce_single_product_summary (priorité 35).woocommerce_single_product_summary (priorité 35).
cartAprès le bloc woocommerce/cart.woocommerce_after_cart.
customAction nommée dans hook.Idem.

Un thème peut accueillir le bloc avec do_action('websource_after_header'), do_action('websource_before_footer') ou do_action('websource_footer'). Chaque position est rendue une fois par page.

Gabarit surchargeable

Copiez templates/store.php dans <thème>/websource-storeinfo/store.php. Les variables sont dans $wssi : stores (magasins prêts à afficher), layout, title, style, wide, multi, show, class.

Routes REST

Espace de noms websource-storeinfo/v1. Toutes les routes exigent la capacité de gestion ; sans authentification : 401.

MéthodeCheminParamètresRôle
GET/storesListe des magasins.
POST/storesid (0 = création), active, contentCrée ou met à jour un magasin. 422 sans nom.
DELETE/stores/<id>Supprime un magasin.
POST/stores/<id>/activeactiveAffiche ou masque.
POST/stores/orderids (liste d'entiers)Nouvel ordre.
GET/settingsRéglages et emplacements.
POST/settingssettings, placementsEnregistre (valeurs assainies renvoyées).
POST/previewstore, settings, layout, title, at (AAAA-MM-JJTHH:MM), checkAperçu HTML et explication des horaires.
GET/exportcontact (booléen)Fichier d'export.
POST/importpackage, mode (replace, merge), dry_runAnalyse ou import.
curl -X POST https://example.test/wp-json/websource-storeinfo/v1/stores \
  -H 'X-WP-Nonce: <nonce>' --cookie '<cookies de session>' -H 'Content-Type: application/json' \
  -d '{"id":0,"active":true,"content":{"name":"Magasin de démonstration","city":"Ville-Exemple","hours":{"1":"9h-12h / 14h-18h"}}}'
{"store":{"id":1,"slug":"magasin-de-demonstration","active":true,"content":{"name":"Magasin de démonstration","description":"","note":"","address1":"","address2":"","postcode":"","city":"Ville-Exemple","country":"","country_iso":"","phone":"","email":"","latitude":"","longitude":"","image_id":0,"hours":{"1":"9h-12h / 14h-18h","2":"","3":"","4":"","5":"","6":"","7":""},"seasons":[],"exceptions":[]},"image_url":""}}

Réponse de /import :

{"action":"merge","counts":{"create":2,"update":1,"delete":0,"skip":2},"messages":["Un magasin sans nom a été ignoré."],"dry_run":true,"stores":[],"settings":{},"placements":[]}

Filtres

FiltreParamètresRôle
websource_storeinfo_capability$capabilityCapacité exigée (défaut manage_options).
websource_storeinfo_view$viewDonnées transmises au gabarit.
websource_storeinfo_template$file, $nameFichier de gabarit utilisé.
websource_storeinfo_current_page$pageType de la page courante.
websource_storeinfo_show_placements$showfalse masque les emplacements automatiques sur la page courante.
websource_storeinfo_position_hooks$actions, $positionActions de thèmes classiques pour under_header et footer_col.
websource_storeinfo_labels$labels, $isoTextes du badge (clés de Hours\Labels::FR) pour une autre langue.
websource_storeinfo_organization_id$id@id du nœud Organization auquel rattacher les magasins (parentOrganization). Vide par défaut.
websource_theme_export$sectionsAjoute la section storeinfo à un paquet de thème (sans coordonnées).
// Rattacher les magasins au nœud Organization émis par le thème.
add_filter('websource_storeinfo_organization_id', static function () {
    return home_url('/#organization');
});

Actions

ActionRôle
websource_theme_import ($sections)Applique la section storeinfo d'un paquet de thème (mode remplacer).
websource_after_header, websource_before_footer, websource_footerÀ déclencher par un thème pour accueillir le bloc.

Données structurées

Un nœud LocalBusiness par magasin actif, dans le <head> : @id{accueil}#store-<identifiant court>, name, description, url, image, telephone, email, address, geo et hasMap (si la latitude et la longitude sont valides), openingHoursSpecification (semaine, saisons avec validFrom / validThrough, exceptions). Le magasin principal est émis sur toutes les pages, tous les magasins actifs sur la page de contact. Le réglage schema les désactive.

Export JSON

{
  "plugin": "websource-storeinfo",
  "section": "storeinfo",
  "version": 1,
  "data": {
    "contact_included": false,
    "settings": {"main_store": "magasin-de-demonstration", "contact_page": "@page:contact"},
    "placements": [{"position": "footer_col", "page": "all", "hook": "", "layout": "footer", "store": "slug:magasin-de-demonstration", "title": "Notre magasin"}],
    "stores": [{"slug": "magasin-de-demonstration", "active": true, "content": {"name": "Magasin de démonstration", "image": "https://example.test/wp-content/uploads/photo.jpg", "hours": {"1": "9h-12h"}}}]
  }
}
  • Les magasins sont désignés par leur identifiant court, la page de contact par @page:<slug>, la photo par son adresse.
  • Sans contact_included, les champs address1, address2, postcode, city, country, country_iso, phone, email, latitude, longitude sont vides ; à l'import, ceux d'un magasin existant de même identifiant sont conservés.
  • keep_data n'est jamais exporté ni importé.
  • À l'import, une photo de ce site est réutilisée ; une autre adresse est téléchargée dans la médiathèque (JPEG, PNG ou WebP, 8 Mo).
  • Les paquets du module PrestaShop sont acceptés : textes par code de langue (celui de la langue du site est gardé), emplacements display* inconnus ignorés avec un message.

Variables CSS

Le bloc lit les variables du thème avec une valeur de repli. Surchargez les variables --wssi-* sur .wssi.

VariableLue depuisRepli
--wssi-bg--wst-surface, --color-surface#fff
--wssi-fg--wst-ink, --color-ink#14282b
--wssi-line--wst-line, --color-line#d9e6e4
--wssi-titlecouleur du texte
--wssi-radius--wst-radius, --radius-2xl1.5rem
--wssi-shadow--wst-card-shadownone

Couleur d'accent : --wst-brand, puis --color-brand-600 (repli #0f766e). Colonne de pied de page : --color-footer-ink, --color-footer-muted, --color-footer-line.

Classes : .wssi, .wssi--compact, .wssi--card, .wssi--footer, .wssi--wide, .wssi--multi, .wssi--placed, .wssi--at-<position>, .wssi__badge.is-open|is-closing|is-closed|is-unknown. Dans la carte, la photo passe à côté du texte quand la carte dépasse 46 rem (requête de conteneur).

Polylang et WPML

Les textes saisis (nom, description, note, pays, libellés de saisons et de fermetures, titres d'emplacements) sont déclarés par pll_register_string (groupe « Websource Store Info ») et wpml_register_single_string. Les textes du badge existent en français et en anglais (filtre websource_storeinfo_labels pour une autre langue).

Désinstallation

uninstall.php supprime les quatre options si keep_data est décoché. Les photos restent dans la médiathèque.