如何简化基于RecursiveIteratorIterator的WordPress核心文件删除PHP代码
WordPress站点核心文件删除优化方案
原代码存在的问题
- 重复逻辑:三个WordPress默认目录的删除逻辑完全一致,代码冗余度高
- 风险缺陷:根目录PHP文件删除部分使用了递归遍历规则,会误删子目录站点内的PHP文件,不符合需求
- 缺少容错:没有判断目标目录/文件是否存在,路径不存在时会抛出PHP运行错误
优化后代码
<?php /** * 递归删除指定目录及其所有内容 * @param string $dir 要删除的目录绝对路径 * @return bool */ function recursive_delete_dir(string $dir): bool { // 目录不存在直接返回,避免报错 if (!is_dir($dir)) { return false; } $iterator = new RecursiveIteratorIterator( new RecursiveDirectoryIterator($dir, RecursiveDirectoryIterator::SKIP_DOTS), RecursiveIteratorIterator::CHILD_FIRST ); foreach ($iterator as $fileinfo) { $action = $fileinfo->isDir() ? 'rmdir' : 'unlink'; $action($fileinfo->getRealPath()); } return rmdir($dir); } // 定义站点根目录路径,可根据实际部署情况修改 $directory = __DIR__; // 1. 批量删除三个WordPress核心目录 $wp_core_dirs = ['wp-admin', 'wp-content', 'wp-includes']; foreach ($wp_core_dirs as $dir) { recursive_delete_dir($directory . DIRECTORY_SEPARATOR . $dir); } // 2. 仅删除根目录下的PHP文件,不遍历子目录,完全规避子目录站点误删风险 foreach (scandir($directory) as $item) { $full_path = $directory . DIRECTORY_SEPARATOR . $item; // 只处理根目录下后缀为php的文件 if (is_file($full_path) && pathinfo($full_path, PATHINFO_EXTENSION) === 'php') { unlink($full_path); } }
优化说明
- 代码量减少60%以上,公共函数封装重复逻辑,后续维护只需要修改一处即可
- 根目录PHP文件删除改用
scandir只遍历第一层内容,完全符合不修改子目录文件的需求 - 新增路径存在判断,避免非法路径触发运行报错
- 使用
DIRECTORY_SEPARATOR兼容Windows/Linux不同系统的路径分隔符
注意事项
- 执行脚本前务必备份站点数据,避免误操作造成数据损失
- 确认脚本执行用户拥有目标目录的读写删除权限
- 可先将代码中的
unlink、rmdir替换为echo输出待删除路径,校验删除范围正确后再实际执行删除操作
内容的提问来源于stack exchange,提问作者Hans Desjarlais
相关产品推荐
相关产品推荐

