WordPress实现自动备份

WordPress实现自动备份

WordPress搭建得网站想实现自动备份功能,下载都几个插件,免费版只能实现简单得功能,高级功能都是收费的,而且不便宜。决定自己编码来实现每天自动备份。研究了以下WordPress的架构,要通过代码实现自动备份可以使用PHP代码和wp-cron计划任务来完成。下面是写了一个简单的代码可以每天将将WordPress数据库和文件备份到指定位置。

实现功能如下:

  1. 数据库备份文件存储在 wp-content/backups/ 目录下,文件名格式为 db_backup_YYYYMMDD_HHMMSS.sql
  2. 文件备份则是一个压缩包,存储在同一目录下,文件名格式为 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文件。

Leave a Comment

Your email address will not be published. Required fields are marked *