=== Kiosque — Abonnements & Paywall (Nokash) ===
Contributors: ubuntudevgroup
Tags: paywall, abonnement, presse, mobile money, nokash, subscription
Requires at least: 5.6
Tested up to: 6.7
Requires PHP: 7.2
Stable tag: 1.6.2
License: GPLv3
License URI: https://www.gnu.org/licenses/gpl-3.0.html

Vendez des abonnements de lecture sur votre site d'information. Aucune dépendance : ni WooCommerce, ni compte tiers.

== Description ==

Kiosque transforme un site WordPress d'information en journal payant :

* marquez vos articles « Réservé aux abonnés », un par un, en lot, ou par rubrique entière ;
* le lecteur voit les premiers paragraphes, puis un bloc d'abonnement ;
* il paie en Mobile Money via Nokash, sans quitter l'article ;
* son accès s'ouvre immédiatement et expire automatiquement à l'échéance.

= Ce qui distingue ce plugin =

**La coupure ne casse jamais la mise en page.** L'aperçu est tronqué en fin de paragraphe, jamais au milieu d'une phrase ni à l'intérieur d'une liste ou d'une image.

**Le contenu est réellement protégé.** Le flux RSS et l'API REST sont tronqués eux aussi. Sans cela, l'article complet reste récupérable sur `/wp-json/wp/v2/posts` et le paywall n'est qu'un rideau visuel.

**Le renouvellement ne fait perdre aucun jour payé.** Un lecteur qui se réabonne avant l'échéance voit sa nouvelle période démarrer à la fin de l'ancienne.

**Le lecteur n'est pas obligé de créer un compte.** L'accès fonctionne par cookie signé, et un compte est créé en arrière-plan pour qu'il retrouve son abonnement sur un autre appareil.

**Le plugin s'habille aux couleurs du journal.** Aucune police n'est imposée : le bloc hérite de la typographie du thème. Seule la couleur d'accent se règle dans l'admin.

== Installation ==

1. Téléversez le dossier `nokash-paywall` dans `/wp-content/plugins/` puis activez.
2. Menu **Kiosque > Réglages** : collez votre clé d'intégration Nokash.
3. Menu **Kiosque > Formules** : trois formules d'exemple sont créées, ajustez les prix.
4. Sur un article, encadré **Kiosque — accès** : choisissez « Réservé aux abonnés ».

Pour vendre par rubrique entière, cochez les catégories concernées dans les réglages : tous leurs articles deviennent payants sans intervention sur chaque publication.

== Codes courts ==

* `[kiosque_formules]` — grille tarifaire, à placer sur une page « Nos abonnements ».
* `[kiosque_abonnement]` — état de l'abonnement du lecteur connecté, avec renouvellement.
* `[kiosque_editions]` — kiosque des numéros PDF en vente à l'unité.
* `[kiosque_bibliotheque]` — les numéros achetés par le lecteur, accès permanent.

== Webhook ==

`POST /wp-json/nkpw/v1/webhook`

Corps : `{ "order_id": 12, "status": "SUCCESS", "transaction_id": "NK-XXXX" }`

`order_id` correspond à l'identifiant de la demande d'abonnement.

== Points d'extension ==

* `nkpw_is_premium` — forcer le statut payant d'un contenu.
* `nkpw_can_read` — accorder l'accès selon vos propres règles.
* `nkpw_teaser` — remplacer l'aperçu.
* `nkpw_verify_payment` — vérification serveur à serveur avant activation.
* `nkpw_subscription_activated` — action déclenchée à l'activation.
* `nkpw_plans` — modifier la liste des formules.

Le gabarit du bloc est surchargeable : copiez `templates/paywall-box.php` dans `votre-theme/nokash-paywall/paywall-box.php`.

== Sécurité à connaître ==

La confirmation de paiement provient du navigateur du lecteur. Pour un site à fort volume, branchez le filtre `nkpw_verify_payment` sur l'API Nokash afin de vérifier la transaction côté serveur avant d'ouvrir l'accès.

== Changelog ==

= 1.6.2 =
* Correction : avertissement `_load_textdomain_just_in_time` sous WordPress 6.7. Les traductions se chargent désormais sur `init`, et les réglages par défaut — lus dès `plugins_loaded` — ne contiennent plus aucune chaîne traduite. Les textes visibles par le lecteur sont traduits au moment de l'affichage.

= 1.6.1 =
* Achat de numéro en un clic pour les lecteurs connectés : l'e-mail et le numéro Mobile Money déjà connus ne sont plus redemandés. Le paiement part directement.
* Le numéro Mobile Money est mémorisé sur le compte après un premier achat ou un premier abonnement.
* Correction : la table des achats est désormais recréée si elle manque, sans se fier au seul numéro de version enregistré — une mise à jour interrompue pouvait laisser le plugin croire le schéma à jour.

= 1.6.0 =
* Nouveau réglage « Compte unique » : les boutons « Mon compte » et « Connexion » du thème ouvrent la fenêtre du Kiosque, et mènent à la page « Mon abonnement » une fois le lecteur connecté. Les thèmes tagDiv (Newspaper, Newsmag) sont couverts par défaut, et des sélecteurs supplémentaires peuvent être ajoutés.
* Les boutons du thème sont réaffectés plutôt que masqués : un bouton qui disparaît laisse le lecteur sans repère.

= 1.5.0 =
* Correction majeure : à la déconnexion, le cookie d'accès posé par le plugin n'était pas effacé. Valable plusieurs mois, il laissait l'article débloqué — le lecteur se déconnectait, revenait sur l'article, le lisait en entier et se croyait toujours connecté.
* Nouveau : la connexion se fait dans une fenêtre modale sur la page, plus aucun renvoi vers wp-login.php.
* Ajout : après connexion et après déconnexion, la page est rechargée avec un paramètre unique pour ne pas recevoir une version mise en cache correspondant à l'état précédent.
* Ajout : purge du cache LiteSpeed à la déconnexion et signalement no-cache par son canal propre.

= 1.4.1 =
* Correction : le formulaire de connexion s'affichait sans ses champs et son bouton ne fonctionnait pas. `wp_kses_post()` était appliqué à un balisage pourtant produit et échappé par le plugin : cette fonction supprime les balises `input`, `button` et l'attribut `hidden` en ne gardant que leur texte.
* Le formulaire est désormais visible d'emblée, sans repli.
* Nouveau réglage « Page de connexion » : si le thème possède déjà un espace compte, indiquez son adresse et le formulaire intégré disparaît. Deux endroits pour se connecter sur un même site désorientent le lecteur et créent des comptes en double.

= 1.4.0 =
* Nouveau : connexion du lecteur directement dans le bloc d'abonnement, le kiosque et la bibliothèque. Plus aucun renvoi vers wp-login.php, écran déroutant qui fait abandonner une partie des abonnés qui viennent de payer.
* Nouveau : lien de déconnexion visible dès qu'un lecteur est connecté.
* Nouveau : quand un lecteur connecté voit malgré tout le bloc d'abonnement, le plugin indique explicitement qu'aucun abonnement n'est rattaché à son compte, au lieu de le laisser croire qu'il a payé pour rien.
* Sécurité : la connexion intégrée est limitée à six tentatives par quart d'heure et par adresse IP.

= 1.3.2 =
* Ajout : les articles payants et toutes les pages vues par un lecteur connecté ne sont plus mis en cache (DONOTCACHEPAGE, Cache-Control, X-Accel-Expires, LiteSpeed). Un cache de page servait sinon à l'abonné la version anonyme, avec le bloc « s'abonner » sur un article auquel il a droit.
* Ajout : panneau de diagnostic dans les réglages. Il détecte le HTTPS non transmis par un reverse proxy — cause classique d'une connexion qui « réussit » mais laisse le lecteur déconnecté —, les adresses www/non-www incohérentes et les extensions de cache actives, avec le correctif à copier.

= 1.3.1 =
* Correction majeure : un lecteur ne pouvait plus se connecter après son achat si son mot de passe contenait une apostrophe, un guillemet ou un antislash. WordPress échappe tout `$_POST` et `wp-login.php` compare la valeur échappée sans la déséchapper ; le plugin, lui, retirait les antislashs avant l'enregistrement. Le mot de passe est désormais traité de façon strictement symétrique avec le cœur de WordPress.
* Ajout : lien « Mot de passe oublié » dans le bloc d'abonnement, le kiosque et la bibliothèque.
* Ajout : après création d'un compte, le plugin vérifie que le mot de passe enregistré permet réellement de s'authentifier et journalise l'anomalie le cas échéant.

= 1.3.0 =
* Nouveau : vente de numéros PDF à l'unité, indépendante des abonnements. Chaque numéro a son prix, sa couverture et sa date de parution.
* Nouveau : bibliothèque du lecteur. Un numéro acheté reste accessible sans limite de temps, à la lecture comme au téléchargement.
* Nouveau : les PDF sont stockés hors de la médiathèque, dans un dossier au nom imprévisible, et servis par PHP après vérification de l'achat. Un fichier déposé dans /wp-content/uploads/ resterait accessible à qui devine son URL.
* Nouveau : support des requêtes partielles (en-tête Range), nécessaire aux lecteurs PDF intégrés aux navigateurs.
* Nouveau : le webhook distingue abonnements et achats de numéros.
* Sécurité : le type réel du fichier envoyé est vérifié (signature %PDF-), pas seulement son extension.

= 1.2.0 =
* Nouveau : bandeau « Premium » en tête des articles payants, visible aussi par les abonnés — un lecteur qui paie doit voir ce que son abonnement lui ouvre.
* Nouveau : libellé de la mention personnalisable (Premium, Abonnés, Édition…).
* Correction : la pastille n'apparaissait pas sur les thèmes magazine, qui composent leurs blocs d'articles hors de la boucle WordPress. La condition `in_the_loop()` a été remplacée par des garde-fous ciblant les menus et la balise `title`.
* Correction : la pastille disparaissait dès qu'un lecteur était abonné, alors qu'elle sert de repère éditorial dans les listes.

= 1.1.0 =
* Nouveau : le lecteur choisit son mot de passe pendant l'achat. Son compte est créé et il est connecté dès le paiement, sans dépendre de la réception d'un e-mail.
* Nouveau : mode « connexion obligatoire avant achat », pour les titres qui veulent une base lecteurs identifiée.
* Correction : `wp_new_user_notification()` n'était jamais appelé. Un compte créé automatiquement ne recevait donc pas le lien de définition du mot de passe de WordPress, et restait inaccessible si l'e-mail du plugin n'arrivait pas.
* Sécurité : une adresse déjà associée à un compte ne peut plus servir à un achat anonyme ; le lecteur est invité à se connecter.

= 1.0.1 =
* Correction : le bloc d'abonnement n'apparaissait pas sur les thèmes et extensions SEO qui appellent `the_content` depuis le `<head>` pour générer la méta-description. Ce rendu invisible consommait le drapeau « déjà affiché » et le bloc était omis du corps de la page.

= 1.0.0 =
* Version initiale : formules, paywall, paiement Nokash, expiration automatique, relances, espace abonné.
