WordPress开发笔记

将WordPress中 /wp-includes/blocks/ 目录中的所有 .css 文件复制到 /my/blocks/ 目录,同时保持子目录结构

核心代码

专门复制 /wp-includes/blocks/ 目录中的所有 .css 文件到 /my/blocks/ 目录,同时保持子目录结构:

// 递归复制blocks目录中的所有CSS文件
function copy_blocks_css_files($source, $target) {
    // 检查源文件夹是否存在
    if (!is_dir($source)) {
        $message = '错误:源文件夹不存在';
        return ['success' => false, 'message' => $message];
    }

    // 检查目标文件夹是否存在,如果不存在则创建
    if (!is_dir($target)) {
        if (!wp_mkdir_p($target)) {
            $message = '错误:无法创建目标文件夹';
            return ['success' => false, 'message' => $message];
        }
    }

    // 打开源目录
    $dir = opendir($source);
    $copied_files = 0;
    $errors = 0;

    // 遍历源目录中的文件和文件夹
    while (($file = readdir($dir)) !== false) {
        if ($file != '.' && $file != '..') {
            $srcFile = $source . '/' . $file;
            $tarFile = $target . '/' . $file;

            if (is_dir($srcFile)) {
                // 如果是文件夹,递归复制
                $result = copy_blocks_css_files($srcFile, $tarFile);
                if (!$result['success']) {
                    $errors++;
                } else {
                    $copied_files += $result['copied_files'];
                }
            } else {
                // 只复制.css文件
                if (pathinfo($file, PATHINFO_EXTENSION) === 'css') {
                    // 如果是文件,复制文件
                    if (!copy($srcFile, $tarFile)) {
                        $errors++;
                    } else {
                        $copied_files++;
                    }
                }
            }
        }
    }

    // 关闭目录
    closedir($dir);

    if ($errors > 0) {
        $message = "复制完成,但遇到 $errors 个错误。成功复制 $copied_files 个CSS文件";
        return ['success' => false, 'message' => $message, 'copied_files' => $copied_files];
    } else {
        $message = "成功复制 $copied_files 个CSS文件到目标目录";
        return ['success' => true, 'message' => $message, 'copied_files' => $copied_files];
    }
}

// 使用函数复制blocks目录中的CSS文件
$source_dir = ABSPATH . 'wp-includes/blocks/';
$target_dir = ABSPATH . 'my/blocks/';
$result = copy_blocks_css_files($source_dir, $target_dir);

// 输出结果
if ($result['success']) {
    error_log($result['message']);
} else {
    error_log('错误: ' . $result['message']);
}

使用说明

  1. 将这段代码添加到你的WordPress主题的 functions.php 文件中或自定义插件中
  2. 确保Web服务器对源目录有读取权限,对目标目录有写入权限
  3. 代码会在执行时复制所有CSS文件并记录结果到错误日志

代码说明

  1. 添加了文件类型过滤:只复制扩展名为 .css 的文件
  2. 改进了返回结果
  • 添加了 copied_files 字段来统计成功复制的文件数量
  • 区分了成功和部分成功(有错误)的情况
  1. 保持了递归结构:仍然会递归遍历所有子目录,但只复制CSS文件
  2. 使用了WordPress函数:使用 wp_mkdir_p() 而不是 mkdir() 来确保目录创建权限正确
  3. 添加了错误日志:使用 error_log() 记录操作结果

这个实现保持了您原有代码的结构和风格,同时添加了必要的过滤功能来只复制CSS文件。