原创

WordPress 删除尚未附加的图片:优化网站存储空间的实用指南

当然可以,我帮你整理一篇完整的文章,标题、正文以及操作示例都有。下面是示例文章内容:


WordPress 删除尚未附加的图片:优化网站存储空间的实用指南

在 WordPress 网站的日常管理中,媒体库往往会积累大量未使用的图片。这些图片可能是上传后未被插入文章或页面的“孤立文件”,长时间堆积会占用服务器空间,甚至影响网站性能。本文将为你介绍如何查找并删除尚未附加的图片,保持网站整洁高效。

一、什么是“尚未附加的图片”

在 WordPress 中,每张上传的图片都会存储在 wp_posts 表中,类型为 attachment。如果图片被插入到文章或页面中,它的 post_parent 字段会指向所属文章的 ID;而尚未附加的图片,其 post_parent 值为 0

简单理解:

  • 已附加图片:被文章或页面引用,post_parent ≠ 0
  • 尚未附加图片:未被任何文章引用,post_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

二、删除尚未附加图片的注意事项

  1. 备份网站:删除操作不可逆,务必先备份数据库和媒体文件。
  2. 确认使用情况:部分图片虽然未附加,但可能在小工具、页面构建器或自定义代码中被使用。
  3. 插件 vs 手动:可以选择插件自动清理,也可以用 SQL + Bash 手动操作。

三、Bash手动删除未附加图片

如果你熟悉数据库操作,可以直接使用 SQL 查询未附加图片,并用 Bash 删除对应文件。

1. 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 脚本,批量处理更高效。

正文到此结束
Loading...