Vue d'ensemble
- Espace de noms PHP :
Websource\Reassurance(classes danssrc/, chargeur PSR-4 intégré, aucune dépendance Composer). - Point d'entrée :
Websource\Reassurance\Plugin::instance(). - Données : options
wsx_reassurance_groups(groupes, chargée automatiquement),wsx_reassurance_images(icônes envoyées),wsx_reassurance_keep_data(1ou0). - Fichiers envoyés :
wp-content/uploads/websource-reassurance/(noms aléatoires,.htaccessqui interdit toute exécution). - Capacité requise pour gérer les groupes :
manage_options(filtrewebsource_reassurance_capability).
Un groupe est identifié par un numéro (id) et par un identifiant lisible (identifier, par exemple accueil), créé à partir de son nom et stable ensuite.
Bloc Gutenberg
Nom : websource/reassurance (rendu serveur, blocks/reassurance/block.json).
| Attribut | Type | Défaut | Rôle |
|---|---|---|---|
group | string | "" | Identifiant ou numéro du groupe. |
layout | string | "" | box, wide, list, ou vide pour garder la disposition du groupe. |
columns | integer | 0 | Colonnes sur ordinateur (1 à 6), 0 pour garder le réglage du groupe. |
<!-- wp:websource/reassurance {"group":"accueil","layout":"list"} /-->
Le bloc ne rend rien si le groupe n'existe pas, est masqué ou n'a aucun bloc.
Code court
[websource_reassurance group="accueil"]
[websource_reassurance group="3" layout="wide" columns="3"]
| Attribut | Rôle |
|---|---|
group (ou id) | Identifiant ou numéro du groupe. |
layout | box, wide ou list (facultatif). |
columns | 1 à 6 (facultatif). Tablette : 2 au plus, téléphone : 1. |
Fonctions publiques
// Dans un modèle de thème.
echo websource_reassurance_render( 'accueil' );
echo websource_reassurance_render( 3, array( 'layout' => 'wide', 'columns' => 3 ) );
// Équivalent objet.
echo \Websource\Reassurance\Plugin::instance()->render( 'accueil' );
websource_reassurance_render( string|int $group, array $overrides = array() ): string renvoie le HTML du groupe, ou une chaîne vide. La feuille de style est mise en file au moment du rendu.
Emplacements automatiques
| Position | Thème à blocs | Thème classique |
|---|---|---|
home | Fin du contenu si l'accueil est une page statique (filtre the_content), sinon avant la partie de modèle « footer » | Idem, sinon action get_footer |
product | Après le bloc woocommerce/add-to-cart-form (ou add-to-cart-with-options) | woocommerce_single_product_summary, priorité 35 |
cart | Après le bloc woocommerce/cart | woocommerce_after_cart_table |
checkout | Avant le bloc woocommerce/checkout | woocommerce_review_order_before_payment |
under_header | Après la partie de modèle de zone « header » | Actions listées par le filtre websource_reassurance_header_hooks |
before_footer | Avant la partie de modèle de zone « footer » | get_footer |
footer | Avant la balise </footer> de la partie de modèle « footer » | wp_footer, priorité 5 |
custom | Action au nom saisi par le commerçant | Idem |
Un thème peut aussi déclencher lui-même ces actions, que l'extension écoute :
do_action( 'websource_after_header' ); // position under_header
do_action( 'websource_before_footer' ); // positions home (repli) et before_footer
do_action( 'websource_footer' ); // position footer
Chaque groupe placé automatiquement est enveloppé dans <div class="wsr-slot wsr-slot--<position>">. Un même groupe n'est jamais imprimé deux fois à la même position.
Types de page reconnus pour la condition « Sur quelles pages ? » : all, home, category (boutique, catégories et étiquettes de produits), product, brand (taxonomie product_brand), cms (pages), blog, search, login, account, cart, checkout, contact, notfound.
Hooks et filtres
Filtres
| Filtre | Paramètres | Rôle |
|---|---|---|
websource_reassurance_view | array $view | Données passées au modèle : classes, style, identifier, title, items (icon, title, text, url). |
websource_reassurance_html | string $html, array $view | HTML final d'un groupe. |
websource_reassurance_page_type | string $page | Type de la page courante. |
websource_reassurance_contact_slugs | string[] $slugs | Slugs des pages considérées comme page de contact. |
websource_reassurance_header_hooks | string[] $hooks | Actions de thèmes classiques déclenchées après l'en-tête. |
websource_reassurance_theme_palette | array $palette | Couleurs de l'aperçu de l'administration : brand, brand50, brand700, ink, line, surface, source (theme ou fallback). |
websource_reassurance_capability | string $capability | Capacité requise pour gérer les groupes. |
// Donner à l'aperçu les vraies couleurs du thème.
add_filter( 'websource_reassurance_theme_palette', function ( $palette ) {
$palette['brand'] = '#0f766e';
$palette['brand50'] = '#effaf8';
$palette['source'] = 'theme';
return $palette;
} );
Actions
| Action | Rôle |
|---|---|
websource_reassurance_changed | Déclenchée après un enregistrement, un affichage ou masquage, une suppression ou un import. C'est l'endroit où vider un cache de pages. |
Modèle surchargeable
Copiez templates/group.php dans <votre-thème>/websource-reassurance/group.php. La variable $wsr_view contient les données du filtre websource_reassurance_view.
Routes REST
Espace de noms : websource-reassurance/v1. Toutes les routes exigent un utilisateur connecté ayant la capacité de gestion, et l'en-tête X-WP-Nonce (nonce wp_rest).
| Méthode | Chemin | Paramètres | Rôle |
|---|---|---|---|
| GET | /groups | — | Liste des groupes et réglage de conservation. |
| POST | /groups | name (string), preset (starter ou empty) | Crée un groupe (masqué). |
| GET | /groups/{id} | — | Données de l'éditeur (brouillon s'il existe), aperçu, conseils de contraste. |
| PUT | /groups/{id} | content (object) | Publie le contenu. |
| DELETE | /groups/{id} | — | Supprime le groupe. |
| POST | /groups/{id}/draft | content (object) | Enregistre un brouillon ; renvoie preview, warnings, has_draft. |
| POST | /groups/{id}/toggle | active (boolean) | Affiche ou masque le groupe. |
| POST | /groups/{id}/duplicate | — | Duplique le groupe. |
| POST | /groups/{id}/enable-defaults | — | Ajoute les emplacements accueil, fiche produit et panier. |
| GET | /images | — | Icônes envoyées. |
| POST | /images | file (multipart) | Envoie une icône (contrôlée et nettoyée). |
| DELETE | /images/{id} | — | Supprime une icône inutilisée (409 si elle est utilisée). |
| POST | /settings | keep_data (boolean) | Réglage de conservation des données. |
| GET | /export | — | Export JSON des groupes publiés. |
| POST | /import | package (object), mode (merge ou replace), dry_run (boolean) | Importe un export, ou l'analyse sans écrire. |
Exemple de requête :
curl -X PUT "https://exemple.fr/wp-json/websource-reassurance/v1/groups/1" \
-H "X-WP-Nonce: <nonce>" -H "Content-Type: application/json" --cookie "<cookies de session>" \
-d '{"content":{"name":"Accueil","title":"Pourquoi commander chez nous ?",
"columns":{"lg":4,"md":2,"sm":1},
"design":{"inherit":true,"layout":"box"},
"items":[{"icon":{"type":"library","value":"truck"},"title":"Livraison rapide","text":"Expédition sous 24 à 48 h ouvrées.","url":"post:11"}],
"placements":[{"position":"home","page":"home"},{"position":"under_header","page":"category"}]}}'
Exemple de réponse (abrégée) :
{
"id": 1,
"identifier": "accueil",
"name": "Accueil",
"active": true,
"has_draft": false,
"content": { "name": "Accueil", "title": "Pourquoi commander chez nous ?", "columns": { "lg": 4, "md": 2, "sm": 1 }, "design": { "inherit": true, "layout": "box" }, "items": [], "placements": [] },
"images": [],
"media": {},
"preview": "<section class=\"wsr wsr--box …\">…</section>",
"warnings": []
}
Erreurs : objet WordPress standard (code, message, data.status), par exemple wsr_not_found (404), wsr_upload (400), wsr_in_use (409), wsr_import (400).
Structure de content
| Clé | Valeurs |
|---|---|
name | Nom interne, 150 caractères. |
title | Titre affiché au-dessus des blocs, 150 caractères. |
columns | lg, md, sm : 1 à 6. |
design | inherit (bool), layout (box, wide, list), bg, text, title, border (theme, yes, no), border_color, border_width (1–8), border_style (solid, dashed, dotted, double), shadow et radius (theme, none, small, medium, large), align (left, center), icon_position (top, left), icon_size (16–120), icon_color, icon_shape (round, rounded, square, none), icon_bg, icon_border_width (0–8), icon_border_color. |
items[] | icon ({type: library, value: <clé>}, {type: image, value: <id d'icône envoyée>} ou {type: media, value: <id de pièce jointe>}), title (80), text (300), url. 12 éléments au plus. |
placements[] | position (voir plus haut), page (type de page), hook (nom d'action, pour custom). |
Les couleurs acceptent #rgb, #rgba, #rrggbb, #rrggbbaa, rgb() et rgba() ; elles sont enregistrées en hexadécimal. Toute valeur hors liste est remplacée par la valeur par défaut.
Liens acceptés : http(s)://…, /chemin, #ancre, mailto:, tel:, post:<id>, page:<nom> (home, shop, cart, checkout, account, terms, privacy, ou le slug d'une page). cms:<id> est accepté comme synonyme de post:<id>.
Format d'export
{
"format": "websource-reassurance",
"version": 1,
"generated": "2026-10-08T18:10:00+00:00",
"site": "https://exemple.fr/",
"groups": [
{
"identifier": "accueil",
"name": "Accueil",
"active": true,
"titles": { "fr": "Pourquoi commander chez nous ?" },
"columns": { "lg": 4, "md": 2, "sm": 1 },
"design": { "inherit": true, "layout": "box" },
"items": [
{ "icon": { "type": "library", "value": "truck" }, "titles": { "fr": "Livraison rapide" }, "texts": { "fr": "Expédition sous 24 à 48 h ouvrées." }, "url": "slug:page/livraison" }
],
"placements": [ { "position": "home", "hook": "", "page": "home" } ]
}
]
}
- Les textes sont indexés par code de langue. À l'import, la langue du site est retenue, sinon le premier texte renseigné.
- Une icône envoyée voyage dans le fichier (
{"type":"image","name":…,"extension":…,"data":"<base64>"}) ; elle repasse par les mêmes contrôles qu'un envoi manuel. - Un lien
post:<id>est exporté sous la formeslug:<type>/<slug>et retrouvé par son slug à l'import. - Les brouillons ne sont pas exportés.
Variables CSS
Variables du thème lues par la feuille de style (dans cet ordre, avec repli intégré) :
| Usage | Variables lues | Repli |
|---|---|---|
| Couleur de marque (icônes, survol) | --wst-brand-600, --color-brand-600 | #475569 |
| Fond des pastilles d'icône | --wst-brand-50, --color-brand-50 | #f1f5f9 |
| Texte et titres | --wst-ink, --color-ink | #14282b |
| Bordures | --wst-line, --color-line | #e5e7eb |
| Fond des cartes | --wst-surface, --color-surface | #fff |
| Arrondi des cartes | --wst-radius-xl, --radius-xl | 1rem |
| Ombre des cartes | --wst-card-shadow | none |
| Largeur du bandeau | --wst-container | 1320px |
Variables posées par l'extension sur chaque groupe (attribut style de .wsr), que vous pouvez surcharger :
--wsr-bg, --wsr-text, --wsr-title, --wsr-border, --wsr-border-w, --wsr-border-style, --wsr-radius, --wsr-shadow, --wsr-icon-color, --wsr-icon-bg, --wsr-icon-bc, --wsr-icon-bw, --wsr-icon-size, --wsr-c-lg, --wsr-c-md, --wsr-c-sm.
Classes : .wsr, .wsr--box|wide|list, .wsr--align-left|center, .wsr--icon-top|left, .wsr--shape-round|rounded|square|none, .wsr--border-theme|yes|no, .wsr__inner, .wsr__heading, .wsr__list, .wsr__item, .wsr__card, .wsr__icon, .wsr__body, .wsr__title, .wsr__text. Attribut data-wsr="<identifiant>" sur chaque groupe.
Points de rupture des colonnes : 576 px (tablette) et 992 px (ordinateur).
Multilingue
- Polylang : chaque titre, texte et lien est déclaré par
pll_register_string()(groupe « Websource Reassurance ») et traduit parpll__()à l'affichage. - WPML : chaînes déclarées par l'action
wpml_register_single_string(domainewebsource-reassurance, nomsgroup-<id>-title,group-<id>-item-<n>-title|text|url) et traduites par le filtrewpml_translate_single_string;wpml-config.xmldéclare aussi l'option. - Les raccourcis
post:<id>etpage:<nom>renvoient l'adresse de la traduction (pll_get_post(), filtrewpml_object_id).
Sécurité
- SVG reconstruits par liste blanche d'éléments et d'attributs (
Icon\SvgSanitizer) : ni<script>, ni attributon*, nijavascript:, niforeignObject, ni<image>, ni référence externe ; identifiants internes préfixés. - Images : extension et contenu réel contrôlés, 1 Mo au plus (200 Ko pour un SVG), 4000 px au plus, noms de fichiers aléatoires.
- Textes nettoyés à l'enregistrement et échappés à l'affichage ; valeurs de design limitées à des listes fermées.