当然可以,我帮你整理一篇完整的文章,标题、正文以及操作示例都有。下面是示例文章内容:
在 WordPress 网站的日常管理中,媒体库往往会积累大量未使用的图片。这些图片可能是上传后未被插入文章或页面的“孤立文件”,长时间堆积会占用服务器空间,甚至影响网站性能。本文将为你介绍如何查找并删除尚未附加的图片,保持网站整洁高效。
在 WordPress 中,每张上传的图片都会存储在 wp_posts
表中,类型为 attachment
。如果图片被插入到文章或页面中,它的 post_parent
字段会指向所属文章的 ID;而尚未附加的图片,其 post_parent
值为 0
。
简单理解:
post_parent
≠ 0post_parent
= 0但是还存在一种情况就是文章被删除了,图片没有被删除,这个时候就需要通过sql找出这种图片,并按年月日格式组织/tmp/unattached_paths.txt文件里面,方便后期删除
mysql -u liuhaihua -p'xxxxx' -D liuhaihua -N -e "
-- 导出未附加图片的相对路径
SELECT pm.meta_value AS file_path
FROM wp_posts a
LEFT JOIN wp_postmeta pm ON pm.post_id = a.ID AND pm.meta_key = '_wp_attached_file'
LEFT JOIN wp_posts p ON a.post_parent = p.ID
WHERE a.post_type = 'attachment'
AND a.post_status = 'inherit'
AND a.post_mime_type LIKE 'image/%'
AND (a.post_parent = 0 OR p.ID IS NULL OR p.post_status NOT IN ('publish','private'));
" > /tmp/unattached_paths.txt
如果你熟悉数据库操作,可以直接使用 SQL 查询未附加图片,并用 Bash 删除对应文件。
假设 WordPress 上传目录为 /var/www/html/wp-content/uploads
:
#!/bin/bash
# WordPress 上传目录
UPLOAD_DIR="/alidata2/html/wordpress/wp-content/uploads"
# 读取 SQL 导出的文件列表
while read -r rel_path; do
filepath="$UPLOAD_DIR/$rel_path"
if [ -f "$filepath" ]; then
echo "Deleting $filepath"
rm -f "$filepath"
# 删除缩略图(WordPress 默认生成的变体,如 -150x150.jpg)
base="${filepath%.*}"
ext="${filepath##*.}"
for thumb in "$base"-*."$ext"; do
if [ -f "$thumb" ]; then
echo "Deleting $thumb"
rm -f "$thumb"
fi
done
else
echo "File not found: $filepath"
fi
done < /tmp/unattached_paths.txt
⚠️ 注意:执行前请替换数据库用户名、密码、网站域名以及上传目录,并确保备份已完成。
删除 wp_postmeta 中对应的附件 meta
DELETE pm
FROM wp_postmeta pm
JOIN wp_posts a ON pm.post_id = a.ID
LEFT JOIN wp_posts p ON a.post_parent = p.ID
WHERE a.post_type = 'attachment'
AND a.post_status = 'inherit'
AND a.post_mime_type LIKE 'image/%'
AND (a.post_parent = 0 OR p.ID IS NULL OR p.post_status NOT IN ('publish','private'));
删除 wp_posts 表中对应附件记
DELETE a
FROM wp_posts a
LEFT JOIN wp_posts p ON a.post_parent = p.ID
WHERE a.post_type = 'attachment'
AND a.post_status = 'inherit'
AND a.post_mime_type LIKE 'image/%'
AND (a.post_parent = 0 OR p.ID IS NULL OR p.post_status NOT IN ('publish','private'));
定期清理未附加图片可以:
推荐策略:对非技术用户,使用插件最安全;技术人员可以结合 SQL + Bash 脚本,批量处理更高效。