Plugin WordPress : créez une sauvegarde de thème quotidienne simple

Au cours des derniers mois, j’ai travaillé dur pour améliorer les performances de mon WordPress thème enfant. Périodiquement, j’introduisais un problème dans mon thème enfant au fur et à mesure que je l’optimisais, et je devais revenir à une ancienne copie du code que j’avais mis à jour dans mon thème. Cependant, les sauvegardes quotidiennes sur mon hôte dépassent un gigaoctet, le téléchargement et la recherche du code que je dois restaurer prennent donc du temps.
Perdre votre thème WordPress à cause d’un incident ou d’une attaque malveillante peut être un cauchemar. C’est pourquoi il est crucial de disposer d’un système de sauvegarde fiable. De nombreux plugins proposent des solutions de sauvegarde complètes, mais parfois, vous avez besoin d’une approche simple et ciblée. Cet article se penche sur un plugin WordPress personnalisé conçu pour sauvegarder automatiquement votre thème actif quotidiennement, offrant ainsi une couche de protection supplémentaire pour la conception et les fonctionnalités de votre site.
REMARQUE : Cela ne remplace pas une sauvegarde complète hors site de votre instance WordPress. C’est simplement un moyen simple d’avoir une copie rapidement accessible de votre thème actif. Cela permet d’économiser jusqu’à 10 instances afin que vous ne remplissiez pas votre hôte de sauvegardes.
Plugin WordPress de sauvegarde de thème quotidien
J’ai créé un Sauvegarde de thème quotidienne plugin qui prend votre thème actif, le compresse et le place dans un dossier de sauvegarde sur votre site. Cela rend également ce dossier inaccessible aux spectateurs externes afin que vous puissiez vous assurer que les fichiers ne sont téléchargés par personne.
Pour l’utiliser, ajoutez un dossier à votre wp-content/plugins
dossier appelé daily-theme-backup
et copiez le code suivant dans un fichier de ce répertoire, daily-theme-backup.php
.
<?php
/**
* Plugin Name: Daily Theme Backup
* Description: Creates a daily backup of your active theme and stores it in the wp-content/backup directory.
* Version: 3.0
* Author: Douglas Karr
* Author URI: https://dknewmedia.com
*/
// Create the backup directory if it doesn't exist.
if (!file_exists(WP_CONTENT_DIR . '/backup')) {
mkdir(WP_CONTENT_DIR . '/backup', 0755);
}
// Function to create the .htaccess file for backup directory protection
function protect_backup_directory() {
$htaccess_file = WP_CONTENT_DIR . '/backup/.htaccess';
$htaccess_content="deny from all";
if (!file_exists($htaccess_file)) {
if (insert_with_markers($htaccess_file, 'Daily Theme Backup', $htaccess_content)) {
// Optional: Log success or display a message
error_log('Backup directory protected with .htaccess.');
} else {
// Optional: Log error or display a message
error_log('Error creating .htaccess file for backup directory protection.');
}
}
}
// Run the protect_backup_directory function on plugin activation.
register_activation_hook( __FILE__, 'protect_backup_directory' );
// Schedule the daily backup.
if (!wp_next_scheduled('daily_theme_backup')) {
wp_schedule_event(time(), 'daily', 'daily_theme_backup');
}
// Hook the backup function to the scheduled event.
add_action('daily_theme_backup', 'create_theme_backup');
// Run the backup function once on plugin activation.
register_activation_hook( __FILE__, 'create_theme_backup' );
// Add a "Backup Now" link to the plugin actions.
add_filter( 'plugin_action_links_' . plugin_basename(__FILE__), 'add_theme_backup_action_link' );
function add_theme_backup_action_link( $links ) {
$backup_link = '<a href="' . esc_url( add_query_arg( 'backup_now', 'true' ) ) . '">Backup Now</a>';
array_unshift( $links, $backup_link ); // Add the link with a separator
return $links;
}
// Check for the "backup_now" query parameter and trigger the backup.
if ( isset( $_GET['backup_now'] ) && $_GET['backup_now'] == 'true' ) {
create_theme_backup();
// Optionally, display a success message.
add_action( 'admin_notices', 'display_backup_success_message' );
}
function display_backup_success_message() {
echo '<div class="notice notice-success is-dismissible"><p>Theme backup created successfully!</p></div>';
}
function create_theme_backup() {
// Get the active theme directory.
$theme_dir = get_stylesheet_directory();
$theme_name = basename($theme_dir);
// Create the backup filename with timestamp if triggered manually.
if ( isset( $_GET['backup_now'] ) && $_GET['backup_now'] == 'true' ) {
$backup_file = WP_CONTENT_DIR . '/backup/' . $theme_name . '-' . date('Y-m-d-H-i-s') . '.zip';
} else {
$backup_file = WP_CONTENT_DIR . '/backup/' . $theme_name . '-' . date('Y-m-d') . '.zip';
}
// Create the zip archive.
$zip = new ZipArchive();
if ($zip->open($backup_file, ZipArchive::CREATE) === TRUE) {
// Add the theme directory to the zip archive.
$files = new RecursiveIteratorIterator(
new RecursiveDirectoryIterator($theme_dir),
RecursiveIteratorIterator::LEAVES_ONLY
);
foreach ($files as $name => $file) {
// Skip directories (they would be added automatically)
if (!$file->isDir()) {
// Get real and relative path for current file
$filePath = $file->getRealPath();
$relativePath = substr($filePath, strlen($theme_dir) + 1);
// Add current file to archive
$zip->addFile($filePath, $relativePath);
}
}
$zip->close();
// Delete old backups.
$backup_files = glob(WP_CONTENT_DIR . '/backup/' . $theme_name . '-*.zip');
if (count($backup_files) > 10) {
usort($backup_files, 'filemtime_compare');
for ($i = 0; $i < count($backup_files) - 10; $i++) {
unlink($backup_files[$i]);
}
}
} else {
// Log an error if the zip archive could not be created.
error_log('Error creating theme backup.');
}
}
// Helper function to compare file modification times.
function filemtime_compare($a, $b) {
return filemtime($a) - filemtime($b);
}
?>
Le code : une panne
Ce plugin utilise PHP et les fonctions intégrées de WordPress pour atteindre son objectif. Décomposons les éléments clés :
1. Préparer le terrain :
// Create the backup directory if it doesn't exist.
if (!file_exists(WP_CONTENT_DIR . '/backup')) {
mkdir(WP_CONTENT_DIR . '/backup', 0755);
}
// Function to create the .htaccess file for backup directory protection
function protect_backup_directory() {
$htaccess_file = WP_CONTENT_DIR . '/backup/.htaccess';
$htaccess_content="deny from all";
if (!file_exists($htaccess_file)) {
if (insert_with_markers($htaccess_file, 'Daily Theme Backup', $htaccess_content)) {
error_log('Backup directory protected with .htaccess.');
} else {
error_log('Error creating .htaccess file for backup directory protection.');
}
}
}
// Run the protect_backup_directory function on plugin activation.
register_activation_hook( __FILE__, 'protect_backup_directory' );
- Le code commence par créer un répertoire de « sauvegarde » dédié dans
wp-content
s’il n’existe pas déjà. C’est ici que nos sauvegardes de thèmes seront stockées. - La sécurité est primordiale. Le
protect_backup_directory()
la fonction utilise un.htaccess
fichier pour restreindre l’accès à ce répertoire. Cela empêche quiconque de télécharger directement vos fichiers de sauvegarde via un navigateur Web. Cette fonction est liée à l’activation du plugin, garantissant que le répertoire de sauvegarde est immédiatement sécurisé.
2. Planification de la sauvegarde :
// Schedule the daily backup.
if (!wp_next_scheduled('daily_theme_backup')) {
wp_schedule_event(time(), 'daily', 'daily_theme_backup');
}
// Hook the backup function to the scheduled event.
add_action('daily_theme_backup', 'create_theme_backup');
- WordPress propose un mécanisme de planification pratique.
wp_schedule_event
est utilisé pour planifier lecreate_theme_backup
fonction à exécuter quotidiennement. Cela garantit que votre thème est sauvegardé automatiquement chaque jour.
3. Le processus de sauvegarde :
function create_theme_backup() {
// Get the active theme directory.
$theme_dir = get_stylesheet_directory();
$theme_name = basename($theme_dir);
// Create the backup filename with timestamp if triggered manually.
if ( isset( $_GET['backup_now'] ) && $_GET['backup_now'] == 'true' ) {
$backup_file = WP_CONTENT_DIR . '/backup/' . $theme_name . '-' . date('Y-m-d-H-i-s') . '.zip';
} else {
$backup_file = WP_CONTENT_DIR . '/backup/' . $theme_name . '-' . date('Y-m-d') . '.zip';
}
// Create the zip archive.
$zip = new ZipArchive();
if ($zip->open($backup_file, ZipArchive::CREATE) === TRUE) {
// Add the theme directory to the zip archive.
$files = new RecursiveIteratorIterator(
new RecursiveDirectoryIterator($theme_dir),
RecursiveIteratorIterator::LEAVES_ONLY
);
foreach ($files as $name => $file) {
if (!$file->isDir()) {
$filePath = $file->getRealPath();
$relativePath = substr($filePath, strlen($theme_dir) + 1);
$zip->addFile($filePath, $relativePath);
}
}
$zip->close();
// Delete old backups.
$backup_files = glob(WP_CONTENT_DIR . '/backup/' . $theme_name . '-*.zip');
if (count($backup_files) > 10) {
usort($backup_files, 'filemtime_compare');
for ($i = 0; $i < count($backup_files) - 10; $i++) {
unlink($backup_files[$i]);
}
}
} else {
error_log('Error creating theme backup.');
}
}
// Helper function to compare file modification times.
function filemtime_compare($a, $b) {
return filemtime($a) - filemtime($b);
}
- Le cœur du plugin est le
create_theme_backup()
fonction. Il identifie le thème actif, crée une archive zip et ajoute méticuleusement tous les fichiers de thème. - Le code comprend également un mécanisme de nettoyage pour éviter l’encombrement. Il conserve uniquement les dix dernières sauvegardes, supprimant les plus anciennes pour économiser de l’espace.
4. Sauvegardes à la demande :
// Add a "Backup Now" link to the plugin actions.
add_filter( 'plugin_action_links_' . plugin_basename(__FILE__), 'add_theme_backup_action_link' );
function add_theme_backup_action_link( $links ) {
$backup_link = '<a href="' . esc_url( add_query_arg( 'backup_now', 'true' ) ) . '">Backup Now</a>';
array_unshift( $links, $backup_link . ' | ' );
return $links;
}
// Check for the "backup_now" query parameter and trigger the backup.
if ( isset( $_GET['backup_now'] ) && $_GET['backup_now'] == 'true' ) {
create_theme_backup();
add_action( 'admin_notices', 'display_backup_success_message' );
}
function display_backup_success_message() {
echo '<div class="notice notice-success is-dismissible"><p>Theme backup created successfully!</p></div>';
}
- La flexibilité est la clé. Le plugin ajoute un Sauvegarder maintenant lien vers sa page dans la zone d’administration WordPress. Cela vous permet de créer une sauvegarde à la demande en plus des sauvegardes quotidiennes planifiées. Un horodatage est ajouté à ces sauvegardes manuelles pour éviter d’écraser les sauvegardes quotidiennes.
Pourquoi c’est important
Ce plugin fournit une solution ciblée pour sauvegarder votre thème WordPress. L’automatisation du processus de sauvegarde et la sécurisation des fichiers de sauvegarde offrent une tranquillité d’esprit et une option de récupération rapide en cas de problèmes inattendus. Comprendre ce code vous permet de le personnaliser davantage, de l’adapter à vos besoins spécifiques ou de l’étendre pour sauvegarder d’autres éléments cruciaux de votre site WordPress.
Source link