WordPress搭建得网站想实现自动备份功能,下载都几个插件,免费版只能实现简单得功能,高级功能都是收费的,而且不便宜。决定自己编码来实现每天自动备份。研究了以下WordPress的架构,要通过代码实现自动备份可以使用PHP代码和wp-cron
计划任务来完成。下面是写了一个简单的代码可以每天将将WordPress数据库和文件备份到指定位置。
实现功能如下:
- 数据库备份文件存储在
wp-content/backups/
目录下,文件名格式为db_backup_YYYYMMDD_HHMMSS.sql
。 - 文件备份则是一个压缩包,存储在同一目录下,文件名格式为
files_backup_YYYYMMDD_HHMMSS.zip
。
步骤1:创建自动备份功能
将以下代码添加到主题的 functions.php
文件或自定义插件中。
php复制代码function custom_wordpress_backup() {
// 获取当前时间戳,用于生成唯一的备份文件名
$timestamp = date('Ymd_His');
// 备份文件存放路径
$backup_dir = WP_CONTENT_DIR . '/backups/';
// 检查备份目录是否存在,如果不存在则创建
if (!is_dir($backup_dir)) {
mkdir($backup_dir, 0755, true);
}
// 数据库备份
global $wpdb;
$db_name = DB_NAME;
$db_user = DB_USER;
$db_password = DB_PASSWORD;
$db_host = DB_HOST;
// 使用 `mysqldump` 命令备份数据库
$backup_file = $backup_dir . 'db_backup_' . $timestamp . '.sql';
$command = "mysqldump --user={$db_user} --password={$db_password} --host={$db_host} {$db_name} > {$backup_file}";
system($command);
// 网站文件备份
$files_backup_file = $backup_dir . 'files_backup_' . $timestamp . '.zip';
$root_dir = ABSPATH; // WordPress安装根目录
$zip = new ZipArchive();
if ($zip->open($files_backup_file, ZipArchive::CREATE) === TRUE) {
$files = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($root_dir), RecursiveIteratorIterator::LEAVES_ONLY);
foreach ($files as $file) {
// 忽略目录,只添加文件
if (!$file->isDir()) {
$file_path = $file->getRealPath();
$relative_path = substr($file_path, strlen($root_dir));
$zip->addFile($file_path, $relative_path);
}
}
$zip->close();
}
}
步骤2:设置计划任务(WP-Cron)
WordPress自带的 wp-cron
可以定时执行任务。你可以将备份函数绑定到 wp-cron
上。下面的代码展示如何每隔一天进行一次备份。
php复制代码// 添加自定义定时事件
function custom_schedule_backup_event() {
if (!wp_next_scheduled('custom_backup_event')) {
wp_schedule_event(time(), 'daily', 'custom_backup_event');
}
}
add_action('wp', 'custom_schedule_backup_event');
// 当计划任务触发时,执行备份功能
add_action('custom_backup_event', 'custom_wordpress_backup');
添加代码后保存文件即可自动运行。
要注意的是有些主题在管理页面编辑 functions.php
支持不太好,可能会导致该文件被清空,导致网站不能访问。建议修改前先登录到服务器:
在wp-content/themes/twentytwentytwo目录下将functions.php
备份,twentytwentytwo是你主题的名称,根据你实际使用的主题进入相应的主题目录下。
建议将functions.php
下载到本地,编辑好后再上传覆盖原来的functions.php
文件。