=== Websource Blog ===
Contributors: websource
Tags: blog, seo, avif, carousel, json-ld
Requires at least: 6.0
Tested up to: 7.1
Requires PHP: 8.1
Stable tag: 1.0.1
License: GPLv2 or later
License URI: https://www.gnu.org/licenses/gpl-2.0.html

Blog orienté SEO : type de contenu dédié, catégories, tags, URLs réécrites, images AVIF optionnelles, lazyload, carousel d'accueil, publication programmée, JSON-LD et sitemap.

== Description ==

Websource Blog est le portage WordPress du module PrestaShop du même nom (version 1.0.1). Il ajoute un blog complet, **séparé des articles natifs de WordPress** : un type de contenu `wsb_post`, une taxonomie hiérarchique de catégories `wsb_category` et des tags `wsb_tag`. Aucun article natif n'est modifié ; il n'y a aucune dépendance externe et aucun jQuery côté public.

**Fonctionnalités**

* URLs réécrites avec préfixe configurable (défaut `blog`) : `/blog`, `/blog/{categorie}`, `/blog/{categorie}/{article}`, `/blog/tag/{tag}`, pagination `/page/N`. Redirection 301 vers l'URL canonique quand la catégorie d'un article change. Les règles sont régénérées à l'activation et au changement de préfixe.
* Champs : extrait, image à la une (couverture), auteur affiché, « à la une », compteur de vues, temps de lecture.
* Publication antidatée ou programmée : c'est la date de publication native de WordPress (statut « Planifié »), avec l'aperçu natif des brouillons.
* Images : couverture recadrée en 16/9, variantes 480/960/1440 px, `srcset`/`sizes`, `<picture>`. Conversion AVIF optionnelle (PHP GD avec AVIF, ou Imagick) pour la couverture et les images du contenu, mise en cache, repli JPEG, bouton « Régénérer les images ». Lazyload avec `loading="lazy"`, `decoding="async"` et dimensions explicites ; l'image d'en-tête d'un article est chargée en priorité.
* Carousel des derniers articles : shortcode `[websource_blog_carousel]`, action `websource_blog_render_carousel` et fonction `wsb_render_carousel()`. Défilement natif CSS (scroll-snap), flèches, points, lecture automatique avec pause au survol, `prefers-reduced-motion` respecté.
* SEO : title, meta description, canonical, `rel prev/next`, Open Graph, Twitter Card, `article:*`, JSON-LD `Blog`, `BlogPosting`, `CollectionPage`, `BreadcrumbList`, sitemap XML dédié `/blog-sitemap.xml` (avec images), 404 propres.
* Vidéo d'article « à façade » : image d'appel et bouton lecture, le lecteur (YouTube, Vimeo ou fichier MP4/WebM) n'est chargé qu'au clic.
* Lien d'achat en tête d'article et produits associés (nom, image, lien) en pied d'article. Aucun prix n'est affiché.
* Variables CSS surchargeables : `--wsb-accent`, `--wsb-dark`, `--wsb-gold`, `--wsb-cream`, `--wsb-ink`, `--wsb-line`. Templates surchargeables par le thème.

**Compatibilité avec les plugins SEO** : si Yoast SEO, Rank Math, All in One SEO, SEOPress ou The SEO Framework est actif, Websource Blog n'émet ni title, ni meta description, ni canonical, ni Open Graph, ni Twitter Card, ni JSON-LD, ni `rel prev/next` : ces balises sont laissées au plugin SEO (réglez-y le type de schéma des articles du blog). Le sitemap `/blog-sitemap.xml` reste disponible. Un réglage permet de forcer les balises du plugin (déconseillé). La détection repose sur des constantes et classes propres à ces plugins.

**Limites connues**

* Une seule langue par site : le module PrestaShop est multilingue, pas ce portage. Les extensions de traduction (WPML, Polylang) n'ont pas été testées.
* La programmation d'un article s'appuie sur WP-Cron (le module PrestaShop n'a pas besoin de tâche planifiée). Sur un site à faible trafic, utilisez un vrai cron système pour `wp-cron.php`.
* L'aperçu des brouillons est celui de WordPress (utilisateur connecté), pas un lien à jeton.
* Le compteur de vues n'est pas incrémenté quand la page est servie par un cache de page, et ignore les robots les plus courants.
* L'URL d'un article contient le slug d'une seule catégorie (la plus profonde, puis la plus ancienne) ; la hiérarchie des catégories n'apparaît pas dans l'URL. Il n'y a pas de champ « position » pour les catégories (tri alphabétique).
* AVIF : le serveur doit fournir PHP GD avec AVIF (PHP 8.1 ou plus) ou Imagick avec AVIF, sinon l'option reste désactivée. Avec Imagick, le réglage de qualité peut être ignoré selon la version d'ImageMagick (constaté sur un serveur de test) ; GD le respecte. Pour les images du contenu, seule l'image affichée est convertie (pas de `srcset` AVIF) et la conversion est plafonnée à 2 images par requête : les suivantes sont converties aux visites suivantes.
* Vidéo : aucune miniature n'est demandée à YouTube ou Vimeo (pour ne charger aucune ressource tierce avant le clic) ; sans image d'appel ni couverture, un fond neutre est affiché. Pas de balisage `VideoObject`.
* Le carousel n'est pas inséré automatiquement sur la page d'accueil (WordPress n'a pas d'équivalent au hook `displayHome`) : placez le shortcode (y compris dans le bloc « Shortcode »), la fonction ou l'action dans votre thème. Il n'y a pas de bloc Gutenberg dédié.
* Le sitemap dédié liste au plus 10 000 articles. Un changement de préfixe ne redirige pas les anciennes adresses.
* Une page WordPress portant la même adresse que le préfixe (par exemple une page « Blog ») est masquée par les règles du blog ; un avertissement s'affiche dans les réglages.
* Le title de la page suppose que le thème déclare `title-tag`.

== Installation ==

1. Copiez le dossier `websource-blog` dans `wp-content/plugins/` (ou envoyez le ZIP depuis **Extensions > Ajouter**) puis activez le plugin.
2. Activez les permaliens (Réglages > Permaliens, structure autre que « simple »).
3. Créez vos catégories (**Blog > Catégories**) puis vos articles (**Blog > Ajouter un article**). Un article sans catégorie reçoit la catégorie « Non classé ».
4. Réglages : **Blog > Réglages**.
5. Carousel d'accueil : ajoutez `[websource_blog_carousel]` dans une page, ou `do_action( 'websource_blog_render_carousel' );` dans le template de votre page d'accueil.

== Frequently Asked Questions ==

= Les articles natifs de WordPress sont-ils affectés ? =

Non. Le blog utilise son propre type de contenu `wsb_post` et ses propres taxonomies. Il n'y a pas de migration automatique depuis les articles natifs.

= Comment antidater ou programmer un article ? =

Modifiez la date de publication dans l'éditeur. Une date passée antidate l'article ; une date future le programme (statut « Planifié », publié par WP-Cron à l'heure dite).

= Comment ajouter une vidéo à un article ? =

Renseignez l'adresse dans la boîte « Vidéo de l'article », ou insérez `[wsb_video url="https://youtu.be/…"]` dans le contenu. Le lecteur est créé au clic.

= Comment surcharger l'apparence ? =

Redéfinissez les variables CSS (par exemple `:root { --wsb-accent: #0b6b3a; }`). Pour les templates, copiez ceux du dossier `templates/` dans `websource-blog/` de votre thème (`single.php`, `archive.php`, `parts/post-card.php`, `parts/carousel.php`…), ou utilisez `single-wsb_post.php`, `archive-wsb_post.php`, `taxonomy-wsb_category.php`, `taxonomy-wsb_tag.php` à la racine du thème. Le filtre `websource_blog_template` est aussi disponible.

= Que devient mon contenu à la désinstallation ? =

Par défaut, les articles, catégories et tags sont conservés ; les réglages, les images générées et les compteurs de vues sont supprimés. Cochez « Supprimer aussi les articles… » dans **Blog > Réglages** avant de supprimer le plugin pour tout effacer (les fichiers de la médiathèque ne sont jamais supprimés).

= Quels hooks sont disponibles ? =

Actions : `websource_blog_render_carousel`. Filtres : `websource_blog_carousel_args`, `websource_blog_template`, `websource_blog_seo_context`, `websource_blog_output_seo`, `websource_blog_external_seo_plugin`, `websource_blog_count_view`.

== Changelog ==

= 1.0.1 =
* Première version du portage WordPress, alignée sur la version 1.0.1 du module PrestaShop (vidéo d'article à façade, lien d'achat et produits associés inclus).
