Vue d'ensemble
- Espace de noms
Websource\NewProducts, classes danssrc/(chargeur PSR-4 maison, pas de Composer). - Données : option
wsx_newproducts_blocks(tableau de blocs assainis, 30 au plus), optionwsx_newproducts_settings(new_days), transientswsx_np_*(identifiants de produits, 5 minutes), optionwsx_newproducts_cache_v(génération du cache),wsx_newproducts_version. - Capacité requise pour l'administration :
manage_woocommerce. - Inerte sans WooCommerce : le code court renvoie une chaîne vide, un avis s'affiche dans l'administration.
| Classe | Rôle |
|---|---|
Plugin | Amorçage, rendu d'un bloc, assets, cache, code court, hub d'export / import. |
Settings\BlockStore, Sanitizer, Defaults, SourceCatalog | Stockage, assainissement, valeurs par défaut, catalogue des sources. |
Query\ProductQuery, IdCache | Identifiants de produits par source et contexte, cache. |
Placement\Placements, PageDetector, Dispatcher | Emplacements, type de page, insertion automatique (thèmes à blocs et classiques). |
Render\CardBuilder, StyleBuilder, JsonLdBuilder | Carte produit, variables CSS, JSON-LD. |
Block\ProductsBlock, Rest\RestController, Admin\AdminPage, ThemePackage\ThemePackage | Bloc Gutenberg, REST, écran de réglages, export / import. |
Bloc Gutenberg websource/products
Rendu serveur (block.json, apiVersion 3, éditeur sans build). Catégorie WooCommerce.
| Attribut | Type | Défaut | Rôle |
|---|---|---|---|
blockId | integer | 0 | Numéro du bloc à afficher (0 = premier bloc actif). |
title | string | "" | Titre de remplacement pour cette page. |
hideTitle | boolean | false | Masque le titre. |
count | integer | 0 | Nombre de produits (0 = valeur du bloc, 1 à 24). |
columns | integer | 0 | Colonnes sur grand écran (0 = valeur du bloc, 2 à 6). |
layout | "", grid, carousel | "" | Disposition (vide = valeur du bloc). |
align | wide, full, "" | — | Alignement. |
<!-- wp:websource/products {"blockId":2,"count":4,"layout":"carousel","align":"wide"} /-->
Code court [websource_newproducts]
| Attribut | Rôle |
|---|---|
block | Numéro du bloc (0 = premier bloc actif). |
title | Titre de remplacement (vide = sans titre). |
count | 1 à 24. |
columns | 2 à 6. |
layout | grid ou carousel. |
class | Classes CSS ajoutées à la section. |
[websource_newproducts block="8" title="Notre sélection du moment" columns="3"]
Fonctions PHP
echo websource_newproducts_render(['block' => 2, 'count' => 4, 'layout' => 'carousel']);
websource_newproducts_render(array $options = []): string accepte les mêmes clés que le code court. Les blocs enregistrés sont lisibles par \Websource\NewProducts\Plugin::instance()->store()->all().
Emplacements automatiques
| Emplacement | Thème à blocs | Thème classique |
|---|---|---|
home | fin du core/groupmain de la page d'accueil | woocommerce_after_main_content ou loop_end de la requête principale |
under_header | après la partie de modèle header | actions websource_theme_after_header, storefront_before_content, astra_header_after, generate_after_header, kadence_after_header, ocean_after_header, neve_after_header_wrapper_hook, __after_header (filtre websource_newproducts_position_hooks) |
category_footer | fin du main des pages catégories | woocommerce_after_main_content |
product_footer | woocommerce_after_single_product (priorité 30) | idem |
cart | après le bloc woocommerce/cart ou woocommerce_after_cart | woocommerce_after_cart |
before_footer | avant la partie de modèle footer | get_footer |
footer | dans la partie de modèle footer | wp_footer (priorité 1) |
custom | action WordPress saisie (do_action('…') dans le thème) | idem |
none | jamais (bloc ou code court seulement) | — |
Filet de sécurité en thème à blocs : les emplacements non trouvés sont imprimés dans wp_footer. Les sections placées automatiquement portent la classe wsnp--placed (ou wsnp--placed-in alignwide dans le contenu).
Pages reconnues (PageDetector, filtre websource_newproducts_current_page) : home, shop, category, product, cart, checkout, cms, blog, search.
Filtres
| Filtre | Paramètres | Rôle |
|---|---|---|
websource_newproducts_product_ids | int[] $ids, array $settings, array $options | Identifiants retenus pour un bloc, après cache. |
websource_newproducts_query_args | array $args, array $options | Arguments WP_Query des sources par requête. |
websource_newproducts_cache_ttl | int $seconds (300) | Durée du cache des identifiants. |
websource_newproducts_card | array $card, WC_Product $product, array $settings | Données d'une carte (id, url, name, image, price_html, badges, cart). |
websource_newproducts_badges | array $badges, WC_Product $product, string[] $allowed | Pastilles (type => libellé) dans l'ordre choisi. |
websource_newproducts_button_url | string $url, array $settings | Adresse du bouton « Voir tout ». |
websource_newproducts_view | array $view, array $settings | Variables passées au gabarit section.php. |
websource_newproducts_html | string $html, array $settings, array $view | HTML final d'un bloc. |
websource_newproducts_json_ld | array $data, array $items | Nœud ItemList. |
websource_newproducts_seller_id | string $id, array $settings | @id du vendeur (<accueil>#organization). |
websource_newproducts_template | string $path, string $name | Chemin d'un gabarit (section.php, item.php). |
websource_newproducts_position_hooks | string[] $actions, string $position | Actions de thème classique pour « sous l'en-tête ». |
websource_newproducts_current_page | string $page | Type de page détecté. |
websource_theme_export | array $package | Ajoute la section newproducts à un paquet de thème. |
Actions
| Action | Paramètres | Moment |
|---|---|---|
websource_newproducts_blocks_saved | array $blocks | Après chaque enregistrement de la liste des blocs (vide aussi le cache). |
websource_theme_import | array $package | Importe la section newproducts d'un paquet ($package['merge'] pour ajouter). |
Évènement JavaScript : websource_newproducts_added_to_cart sur document (detail.productId, detail.response) après un ajout AJAX ; wc-blocks_added_to_cart et added_to_cart (jQuery) sont aussi déclenchés pour les compteurs de panier.
Gabarits
Surchargeables dans votre-theme/websource-newproducts/section.php et item.php. section.php reçoit $view (uid, block_id, layout, is_carousel, class, style, title, subtitle, show_button, button_label, button_url, labels, cards, json_ld, item_template) ; item.php reçoit $card.
Structure : section.wsnp.wsnp--grid|wsnp--carousel[.wsnp--custom] > .wsnp__head (.wsnp__title, .wsnp__subtitle, .wsnp__nav avec [data-wsnp-prev] / [data-wsnp-next]) + .wsnp__track[data-wsnp-track] > .wsnp-item > article.wsnp-card[data-product-id] + .wsnp__more > a.wsnp__link.
Routes REST
Espace websource-newproducts/v1.
| Méthode | Chemin | Accès | Paramètres | Rôle |
|---|---|---|---|---|
| GET | /products | manage_woocommerce | search (nom, UGS ou numéro) | Recherche de produits pour la sélection manuelle. |
| GET | /blocks | edit_posts | — | Liste des blocs pour l'éditeur. |
GET /wp-json/websource-newproducts/v1/products?search=sac
X-WP-Nonce: <nonce wp_rest>
[
{ "id": 42, "name": "Sac à dos Nordik", "sku": "WS-007", "image": "https://exemple.fr/wp-content/uploads/2026/10/sac-a-dos-nordik-150x150.jpg" },
{ "id": 39, "name": "Sac cabas Atelier", "sku": "WS-006", "image": "…" }
]
GET /wp-json/websource-newproducts/v1/blocks
[
{ "id": 1, "name": "Nouveautés", "source": "native", "active": true, "placement": "Page d’accueil" }
]
Sans nonce ou sans droit : 401 / 403.
Export / import
admin-post.php?action=wsx_newproducts_export (nonce) télécharge websource-newproducts-<date>.json :
{
"section": "newproducts",
"version": 1,
"plugin": "1.3.0",
"data": {
"new_days": 30,
"blocks": [
{
"id": 7, "name": "Une catégorie", "active": true,
"position": "none", "hook": "", "page": "all",
"title": "Pour la maison", "subtitle": "", "button_label": "Voir tout", "show_button": true,
"count": 8, "source": "category", "category": "category:maison", "products": [],
"sort": "newest", "period_days": 30, "layout": "grid", "columns": 3,
"show_badges": true, "badges": ["new", "discount", "on-sale", "pack", "out_of_stock"],
"show_cart": true, "lazy_images": true, "json_ld": true,
"use_theme_design": false, "bg_color": "#14282b", "title_color": "#ffffff", "borders": "without", "radius": "lg"
}
]
}
}
Références stables : category:<slug>, product:<UGS>, product-slug:<slug>. ThemePackage::import(BlockStore $store, array $section, bool $merge): ?array renvoie ['blocks' => n, 'warnings' => [références introuvables]], ou null si le fichier n'est pas une section newproducts.
Valeurs d'un bloc
| Clé | Valeurs |
|---|---|
source | native, featured, bestsellers, specials, viewed, related, crosssell, category, manual |
position | home, under_header, category_footer, product_footer, cart, before_footer, footer, custom, none |
page | all, home, shop, category, product, cart, checkout, cms, blog, search |
sort | position, newest, oldest, name_asc, price_asc, price_desc |
period_days | 7, 30, 90, 180, 365, 0 (toujours) |
layout | grid, carousel |
badges | sous-ensemble ordonné de new, discount, on-sale, pack, out_of_stock |
borders | inherit, with, without |
radius | inherit, none, sm, md, lg, xl |
count / columns | 1 à 24 / 2 à 6 |
Variables CSS
La feuille assets/css/front.css lit le thème avec repli :
| Variable lue | Repli | Usage |
|---|---|---|
--wst-brand, --color-brand-600 | #0f766e | Pastilles, bouton, flèches. |
--wst-brand-50, --color-brand-50 | teinte claire | Fond du bouton d'ajout. |
--wst-brand-on, --color-brand-on | #ffffff | Texte sur la couleur de marque. |
--wst-ink, --color-ink | #14282b | Texte. |
--wst-line, --color-line | #d9e6e4 | Bordures des cartes. |
--wst-surface, --color-surface | #ffffff | Fond des cartes. |
--wst-radius-xl, --radius-xl / --wst-radius-2xl, --radius-2xl | 1rem / 1.5rem | Arrondis. |
--wst-card-shadow | none | Ombre des cartes. |
--wst-font-head, --font-head | police du thème | Titre. |
--wst-container, --wp--style--global--wide-size | 80rem | Largeur des sections placées automatiquement. |
Variables posées sur chaque section (attribut style, surchargeables) : --wsnp-cols, --wsnp-cols-md, --wsnp-bg, --wsnp-title, --wsnp-line, --wsnp-shadow, --wsnp-radius, --wsnp-radius-lg.
Cookies et cache
- Cookie
wsx_np_viewed: 20 derniers produits consultés, posé seulement si un bloc utilise la source « déjà vus ». - Transients
wsx_np_<hash>: identifiants par bloc, langue, devise et contexte ; vidés surwoocommerce_update_product,woocommerce_new_product,woocommerce_delete_product,woocommerce_trash_product,woocommerce_product_set_stock,woocommerce_variation_set_stock,woocommerce_product_set_visibility,woocommerce_order_status_changed,woocommerce_scheduled_sales,transition_post_statusd'un produit,edited_product_cat,delete_product_cat, enregistrement des blocs. Un résultat vide n'est pas mis en cache.
Traductions
Domaine websource-newproducts, fichiers languages/websource-newproducts-fr_FR.po|mo et .json pour les scripts. Textes saisis : wpml-config.xml (admin-texts sur wsx_newproducts_blocks) et pll_register_string (groupe « Websource New Products »).