=== STN - Save To Nextcloud ===
Contributors: davelopweb
Tags: nextcloud, backup, restore, webdav, scheduled backup
Requires at least: 4.7
Requires PHP: 7.4
Tested up to: 7.2
Stable tag: 2.6.2
License: GPLv2
License URI: http://www.gnu.org/licenses/gpl-2.0.html

== Description ==

STN – Save To Nextcloud is a simple and reliable plugin to automatically back up your WordPress site and its database directly to your Nextcloud instance.

Set your schedule once, and the plugin runs silently in the background — no manual intervention required. Backups are stored on your own Nextcloud server, giving you full control over your data, accessible from anywhere at any time.

**Features:**

* Scheduled backups: weekly, twice a month, or monthly
* Full backup: database + wp-content folder + wp-config.php + .htaccess
* Database-only backup option
* Chunked upload to Nextcloud (handles large sites on limited hosting)
* Automatic cleanup: keeps only the N most recent backups verified as physically present on Nextcloud
* Auto-update lock: WordPress core, plugins and themes are only auto-updated after a successful scheduled backup
* **Restore system**: restore any backup directly from Nextcloud or from a local ZIP file, with step-by-step progress
* Email notifications on backup and restore completion (or on error)
* REST API endpoints to query backup status and settings
* Multisite compatible

**How it works:**

Each backup runs in multiple steps, each adapted to your server’s available memory, so it works reliably even on shared hosting with low memory limits:

1. Database export to SQL
2. ZIP of wp-content (cache excluded)
3. Merge of SQL, wp-config.php and .htaccess into the ZIP
4. Chunked upload to Nextcloud
5. Assembly of chunks into the final ZIP on Nextcloud
6. Cleanup of temporary files and old backups

**REST API:**

* `/wp-json/STN/saves` — list of backups and next scheduled backup date
* `/wp-json/STN/param` — backup frequency, day, time and retention count

== Installation ==

1. Install STN from the WordPress plugin store and activate it.
2. Go to **Save To Nextcloud → Sauvegarder** and fill in your Nextcloud credentials (URL, username, password) and backup preferences.
3. Click **"Enregistrer la planification"** to schedule your next automatic backup.
4. Click **"Faire une sauvegarde maintenant"** to run an immediate backup.

**Advanced options (in the settings panel):**

* **Number of backups to keep** (1–10): only backups physically present on Nextcloud with a valid ID are counted.
* **Auto-update lock**: when enabled, WordPress core, plugins and themes are only auto-updated within 2 days of a successful backup.
* **Database only**: skip the wp-content ZIP and back up only the database.

**Restore:**

Go to **Save To Nextcloud → Restaurer** to restore a backup. Each backup stored on Nextcloud is verified before being offered as a restore option. You can also restore from a local ZIP file already present on your server.

Note: wp-config.php is never overwritten automatically. It is placed as `wp-config_stn_restore.php` at the root of your site for manual review.

**Deactivating the plugin** removes all scheduled events.
**Deleting the plugin** also removes all database tables and saved options.

== Changelog ==

= 2.6.2 =

Corrections de fiabilité (sauvegarde/restauration) et sécurité :
- Correction critique : la restauration de la base pouvait tronquer silencieusement les grosses tables (INSERT multi-lignes coupé entre deux relances cron). L'export borne désormais la taille de chaque INSERT et la restauration ne coupe qu'à une frontière de statement.
- Confidentialité : les routes REST /wp-json/STN/saves et /wp-json/STN/param n'exposent plus d'informations inutiles (UUID, noms de fichiers complets, état interne) ; les champs restants sont réduits au strict nécessaire et neutralisés (clés opaques) pour éviter toute interprétation par un tiers.
- Correction : la détection des mises à jour en attente (exposée par l'API de supervision) ne fonctionnait pas en single-site (lecture via get_transient au lieu de get_site_transient) et pouvait renvoyer des données périmées en contexte REST. Les transients sont désormais rafraîchis avant lecture et lus en site-transient.
- Correction : l'assemblage final des morceaux sur Nextcloud (MOVE) est maintenant vérifié ; en cas d'échec, la sauvegarde n'est plus déclarée réussie à tort, le ZIP est conservé et récupérable par FTP, l'utilisateur est alerté.
- Correction : plafonnement des relances en cas d'erreur réseau pendant l'envoi (SendChunk) et le téléchargement (DownloadChunk) — plus de boucle de cron infinie si Nextcloud reste injoignable.
- Correction : .htaccess ajouté au ZIP uniquement s'il existe (FusionZip).
- Compatibilité : Tested up to corrigé (version WordPress, et non PHP).
- Fiabilité restauration : vérification du code HTTP au téléchargement (une page d'erreur Nextcloud n'est plus écrite dans le ZIP), gestion des réponses 200/206 et corps vides, pas de décompression auto.
- Fiabilité restauration : un fichier plus volumineux que la mémoire disponible n'est plus sauté (copie avant contrôle de pause) ; extraction repartant d'un dossier temporaire propre et vérifiée.
- Fiabilité restauration : SET FOREIGN_KEY_CHECKS=0, et remontée d'un bilan d'erreurs (requêtes SQL / fichiers en échec) dans le mail de fin au lieu d'un succès affiché à tort.

= 2.6.1 =

Corrections :
- Correction : page blanche sur wp-admin/options.php lors de l'enregistrement de la planification (champ action dupliqué + hook admin_post_ProgramSave mort)
- Correction : Quirks Mode et JSON corrompu causés par une sortie PHP parasite entre les fonctions de page (balise ?> fermante au niveau fichier)
- Correction : en cas d'échec d'envoi vers Nextcloud, le fichier ZIP est maintenant renommé (stn_save_domain_YYYYMMDDHHMMSS.zip) et récupérable par FTP, la BDD est nettoyée et le mail d'erreur indique le nom du fichier

= 2.6.0 =

Ajout du système de restauration :
- Restauration depuis Nextcloud : téléchargement du ZIP par morceaux (chunked, adapté à la mémoire disponible)
- Restauration depuis un fichier ZIP local (FTP)
- Restauration de la base de données (uniquement les tables avec le préfixe WP configuré)
- Restauration de wp-content et .htaccess fichier par fichier avec reprise sur timeout
- wp-config.php placé sous wp-config_stn_restore.php pour révision manuelle
- Nettoyage automatique des fichiers temporaires après restauration
- Notification par mail à la fin de la restauration
- Interface admin dédiée avec liste des sauvegardes disponibles et confirmation avant action

= 2.5.0 =

Corrections critiques de compatibilité hébergeur :
- Correction : stn_get_memory() retournait une valeur négative sur les hébergeurs avec memory_limit = -1
- Correction : INSERT SQL invalide quand des colonnes avaient des valeurs NULL ou vides (CreateBDD)
- Correction : les fichiers SQL n'étaient pas supprimés après fusion (FusionZip)
- Correction : le filtre d'exclusion du cache s'appliquait uniquement aux dossiers, pas aux fichiers (CreateZip)
- Correction : envoi de chunk silencieusement ignoré en cas d'erreur réseau (SendChunk)
- Correction : accès à response["code"] sans vérifier WP_Error possible (MergeChunk)
- Correction : wp_next_scheduled('stn_Save', 'next') → array('next')
- Correction : wp_redirect() sans exit() après la redirection
- Correction : emails séparés par ";" non transmis à wp_mail()
- Correction : préfixe LIKE SQL avec _ interprété comme wildcard
- Ajout : vérification connexion MySQLi et ouverture fichier avec mail d'alerte
- Ajout : vérification extension ZipArchive et MySQLi au démarrage
- Ajout : set_time_limit(0) sur les opérations longues
- Sécurité : nonce sur le formulaire "Faire une sauvegarde maintenant"
- Sécurité : sanitize_callback sur tous les register_setting()
- Correction : formatage du header plugin (double astérisque sur Plugin URI et Version)

= 2.4.6 =

Nettoyage des anciennes sauvegardes

= 2.4.5 =

Optimisation de MAJ auto

= 2.4.4 =

Clean Save lors du lancement manuel

= 2.4.3 =

Debug BDD only

= 2.4.1 =

Possibilité de sauvegarder d'autres app en meme temps en modifiant le fichier OtherApp.php

= 2.3.4 =

Correction de bugs

= 2.3.3 =

Ajout 'permission_callback' en public les API

= 2.3.1 =

Ajout NeedUpdate dans l'API param

= 2.3.1 =

Calcul la mémoire disponible pour les différentes étapes de la sauvegarde

= 2.3 =

Ajout détection update et suppression

= 2.1.0 -> 2.2.4 =

Correctifs Bugs

= 1.0.0 -> 2.1.0 =

Mise en conformité du code pour le store Wordpress

== Links ==

[Knowledge Base](https://davelopweb.fr/)
