WordPress: 移动WordPress 图片 / 媒体文件 的存储目录
以将/domains/public_html/wp-content/uploads/
下的媒体文件移动到/domains/public_html/wp-content/uploads/2023/01/
下为例:
步骤:
1. 获取媒体文件的列表:
由于Windows会忽略文件名大小写,把大小写不同的同名文件当作同一个文件,因此建议在Linux下生成文件列表:
$ cd /domains/public_html/wp-content/uploads/ $ tree -afiF > ~/list.txt
在用户主目录找到list.txt
2. 获取媒体文件名列表:
在EmEditor中,利用正则表达式去除list.txt中多余的内容,只保留文件名:
Ctrl+H打开EmEditor的替换对话框,勾选正则表达式:
去除目录行:
查找:^\./.*?/.*?\n 替换:空
去除文件名前的./
:
查找:\./ 替换:空
保存。
3. 生成EmEditor批处理文件:
将list.txt
改名为list.tsv
,在EmEditor中打开,Ctrl+H打开EmEditor的替换对话框,勾选正则表达式:
查找:^(.*?)\n 替换:on \1 2022/02/\1 \n
保存。
4. 在数据库中进行替换:
导出WordPress数据库为sql文件,在EmEditor中打开:
Ctrl+H打开EmEditor的替换对话框,点击对话框右下角的批处理,点击导入,导入上一步生成的list.tsv文件。
然后点击多项替换全部(参考:批处理替换全部和多项替换全部之间的区别)。完成后保存。
将sql文件导入到WordPress数据库。
5. 移动文件:
将/domains/public_html/wp-content/uploads/下的媒体文件移动到/domains/public_html/wp-content/uploads/2023/01/下。
完成。
有关在数据库中直接替换媒体文件路径的说明:
WordPress数据库中与媒体文件相关的表和字段:
`wp_posts`
`wp_posts`中`post_type`= 'attachment' 为媒体文件页面。
`post_title`,`post_name`字段为初始上传时的文件名,`ID`,`post_name`字段影响媒体文件页面的地址,不影响媒体文件本身的url地址。
`wp_postmeta`
`wp_postmeta`中`meta_key` = '_wp_attached_file' 为媒体文件的路径,路径只包含/wp-content/uploads/后面的部分。
`meta_key` = '_wp_attachment_metadata'为媒体文件的元数据,其中也包含媒体文件的路径。
利用MariaDB
中的REPLACE函数来替换媒体文件的路径也可以,但是速度较慢。
当文章较多时,以30,000篇文章,需要替换2000个媒体文件为例,REPLACE函数替换文章中的媒体文件链接:
update `wp_posts` set `post_content`=replace(`post_content`,'a.jpg','2022/02/a.jpg') WHERE `post_type`= 'post' ;
执行一次需要约3秒,执行2000次需要100分钟。而EmEditor替换sql文件则只需10分钟左右。