在 WordPress 开发或内容迁移过程中,我们常常需要:
- 批量上传大量图片
- 希望图片在媒体库中显示为某个特定年月
- 按顺序写入媒体库(保持排序一致)
- 避免服务器反复拷贝文件(节省空间)
默认后台上传无法实现这些高级需求,但借助 FTP + WP CLI + functions.php 定制代码,可以完美实现。
🧩 实现目标
- ✅ 图片实际文件存在于
/wp-content/uploads/2023/03/ - ✅ 媒体库中显示“上传于 2023 年 3 月”
- ✅ 上传时间按照你设定的起点时间,每张图 +10 秒
- ✅ 媒体库按时间顺序排序展示(非乱序)
- ✅ 不重复复制图片文件(节省空间)
📦 所需准备工具
| 工具 | 用途 | 是否必须 |
|---|---|---|
| FTP / 文件管理器 | 上传图片到服务器 | ✅ |
| WP-CLI | 命令行导入媒体 | ✅ |
| functions.php | 注入上传目录与时间控制逻辑 | ✅ |
🧰 Step 1:上传图片到指定目录
通过 FTP 或主机自带文件管理器:
- 将图片上传到目录,例如:
/wp-content/uploads/2023/03/
注意文件命名统一格式(如 001.jpg、002.jpg),便于后续排序。
🧠 Step 2:在 functions.php 中加入控制代码
在你的主题(如 wp-content/themes/your-theme/functions.php)中加入以下代码:
// 1. 固定上传目录为 /2023/03
add_filter('upload_dir', function ($uploads) {
$custom_subdir = '/2023/03'; // ← 可自定义为你需要的目录
$uploads['subdir'] = $custom_subdir;
$uploads['path'] = $uploads['basedir'] . $custom_subdir;
$uploads['url'] = $uploads['baseurl'] . $custom_subdir;
return $uploads;
});
// 2. 设置上传时间从某日起,每张图增加 10 秒
add_filter('wp_insert_attachment_data', function ($data) {
static $i = 0;
$base_time = strtotime('2023-03-04 14:00:00'); // 起始时间
$custom_time = date('Y-m-d H:i:s', $base_time + ($i * 10)); // 每张图 +10秒
$data['post_date'] = $custom_time;
$data['post_date_gmt'] = get_gmt_from_date($custom_time);
$i++;
return $data;
});
📝 说明:
- 你可以修改路径
/2023/03为任意目标年月 - 起始时间
2023-03-04 14:00:00也可自定义 - 每张图递增 10 秒,确保时间唯一,防止排序混乱
💻 Step 3:使用 SSH 进入 WordPress 根目录
登录你的服务器 SSH 后,进入 WordPress 安装目录:
cd /home/你的用户名/domains/你的域名/public_html
确认是否是正确目录:
ls -al | grep wp-config.php
能看到 wp-config.php,说明你就在根目录 ✅
🚀 Step 4:用 WP CLI 导入媒体文件(不复制)
执行以下命令:
wp media import $(ls -1v wp-content/uploads/2023/03/*.{jpg,jpeg,png,gif,webp,svg}) --skip-copy
参数说明:
ls -1v:按自然顺序列出文件名(001.jpg → 002.jpg → …)--skip-copy:跳过复制操作,避免浪费磁盘空间wp media import:通过 WP CLI 将文件注册到媒体库
✅ 成功后你将在媒体库看到图片,上传时间按你设定的顺序排列,并显示“上传于 2023 年 3 月”。
📌 注意事项
✅ 避免乱序的关键:
WordPress 后台上传多个文件是并发异步,可能导致 $i++ 紊乱;而 WP CLI 是串行执行,可以确保每张图的时间顺序与文件名一致。
🧪 常见问题解答
❓ 后台上传为什么排序会乱?
后台上传多张图是同时发起多个异步请求,$i++ 无法保证顺序。只能通过 WP CLI 保证顺序导入。
❓ 媒体库只显示 80 张图,怎么办?
媒体库的“网格视图”默认最多只加载前 80 张,可以切换到“列表视图”查看更多,或者使用媒体分页插件。
❓ 如何改成导入到别的月份,比如 2024/08?
只需修改 2 个地方:
- functions.php 中的:
$custom_subdir = '/2024/08';
$base_time = strtotime('2024-08-01 10:00:00');
- 上传图片到
/wp-content/uploads/2024/08/
然后执行导入命令:
wp media import $(ls -1v wp-content/uploads/2024/08/*.{jpg,jpeg,png,gif,webp,svg}) --skip-copy
✅ 总结
| 步骤 | 说明 |
|---|---|
| 上传 | FTP 将图片上传到目标年月的文件夹 |
| 控制 | 在 functions.php 中设置上传目录和上传时间规则 |
| 导入 | 用 WP CLI + --skip-copy 将图片写入数据库 |
| 效果 | 图片显示为指定年月,排序整齐,避免乱序 |
🧾 附加建议
- ✅ 可以写成 Shell 脚本批量导入多个目录
- ✅ 上传大量媒体前备份数据库
- ✅ 可结合自定义字段实现更复杂的图片管理