如何在 WordPress 中从媒体库中删除未使用的图像
已发表: 2019-10-15当您的网站运行了一段时间后,有些东西不再需要但仍然存在是正常的。 最烦人的例子之一是不再使用但继续占用 WordPress 空间的图像。
这些您不再在您的帖子或页面中使用的图像,或者在任何其他类型的已过时的内容中,仍然托管在您的服务器上,从而浪费资源和存储空间。 如果您不打算再次使用它们,您可以对它们做的最好的事情就是消除它们。 但是你怎么能找到它们并确保它们没有在任何地方被使用呢? 让我们来看看它…
在开始之前
如果要从 WordPress 中删除不再使用的图像,首先要做的是制作网站的备份副本,包括wp-content文件夹中的媒体文件。
尽管您上传到媒体库的图像存储在wp-content/uploads/中,但如果您使用插件上传文件,它们最终可能会位于不同的文件夹中。 因此,请确保您拥有 WordPress 数据库的备份副本以及wp-content文件夹中的所有文件,而不仅仅是wp-content/uploads 。
创建备份后,我们可以继续执行以下步骤……
检测 WordPress 中的孤立图像
有几种方法可以检测 WordPress 网站内任何内容中不再使用的图像。 最有效的是在 WordPress 数据库中搜索它们。
为此,我们必须知道您上传到 WordPress 媒体库的图像存储在表wp_posts中,就好像它们是帖子或页面一样。 它们与存储在此表中的其他内容的区别在于它们在post_type列中具有附件值。
顺便说一句,重要的注意事项:如果您不了解数据库,最好从现在开始小心您所做的事情,保留数据库的备份,并查看这篇 WordPress Codex 文章,他们在其中解释了所有内容更多详情。
我们刚刚说到哪了? 哦,是的:我们希望找到所有未在您的 WordPress 中使用的图像。 这比定义容易,但别担心,我们将尝试以简单的方式一步一步地解释它。
我们所要做的就是用 SQL 语言编写一个查询以在 WordPress MySQL 数据库中运行。 如果您不知道如何访问您的网站数据库,请联系您的托管服务提供商以获取有关如何访问的说明。 如果他们允许您访问 phpMyAdmin,也可以
您需要运行的查询是:
让我们分解一下。
我们要做的第一件事是从SELECT语句开始选择特定表的所有特定行。 在第 2 行中,星号表示我们想要每一行中的“所有列”。
第 3 行和第 4 行表示我们感兴趣的表。在这种情况下,我们要选择 WordPress 附件,正如我所说,它们存储在wp_posts中,这就是我们将使用的表。
从第 5 行开始, WHERE语句让我们添加条件来过滤我们想要的行并排除其余行。 第 6 行和第 14 行之间的每个条件都由AND指令分隔,该指令用于指示必须同时满足所有条件。 如果一行不满足所有WHERE条件,则不会在SELECT查询的输出中返回。
第 6 行的第一个条件定义我们只想获取post_type列中值为attachment的行。 正如我之前所说,帖子和页面以及其他内容也存储在wp_posts表中。 在这种情况下,我们只会得到图像。
对于每个附件,WordPress 会使用post_parent列存储它是在页面上下文中上传还是在帖子中上传。 因此,第 8 行的条件使我们只能获取那些post_parent不存在的附件(即它们没有绑定到任何页面或帖子)。

另一方面,如果我们选择一张图片作为文章或页面的特色图片,WordPress 会在wp_postmeta表中创建一个元数据行,其键为_thumbnail_id ,并作为值设置附件图片的标识符。 在查询的第 10 行中,我们得到了那些其标识符没有作为键_thumbnail_id的wp_postmeta行的值出现的图像。
第 12 行定义了过滤其 URL 未出现在帖子或页面内容中的图像的条件。 也就是说,如果图像的 URL 出现在内容中,我们假设图像仍然有用,因此不应删除。 请注意,图像的 URL 出现在wp_posts表的guid列中。
最后,您可能使用了一些插件,将图像的 URL 放入wp_postmeta表的行中。 第 14 行的条件使我们能够检测到这种特殊情况。
就是这样! 运行此 SQL 查询将返回据称未在您网站的任何地方使用的所有图像。
请记住,在查找孤儿图像时,可能会出现误报。 也就是说,标记为未使用但实际上在 WordPress 中使用的图像。 这是因为您可以使用定义自己的表并在其中保留对图像的引用的插件。 如果这是您的情况,您必须通过添加其他条件来调整查询以涵盖这些情况。
删除 WordPress 中的孤立图像
现在我们有了可能不会在 WordPress 中使用的图像,我们应该看看结果,看看我们列出的所有图像是否都在使用。 根据我们找到的内容,我们可以通过添加更多条件来优化查询,如前所述。 如果一切看起来都正确,您可以继续前进。
要删除 WordPress 中的附件,我们有功能wp_delete_attachment ,您可以在此处找到描述。 如果您查看文档,您将看到此函数获取附件标识符和一个布尔参数,指示您是要强制删除还是只是将其丢弃。
当您在 WordPress 中调用此函数时,它将删除附件及其所有相关信息,包括可能的评论、分类中的外观、相关元数据,最重要的是,存储在wp-content文件夹中的图像文件。
要获取我们将在 PHP 中使用的wp_delete_attachment指令列表,我们只需更改前一个查询的第 2 行,以便SELECT查询返回的是构造我们想要的指令的字符串。 查询返回的每一行一个。 你可以在这里看到结果:

现在您只需复制所有这些说明并粘贴它们,例如,在您的主题的文件functions.php中并访问您的网站。 这将导致执行这些指令,从您的 WordPress 中删除孤立的图像。 之后,删除之前粘贴的说明,因为它们将不再需要。
请记住检查您的网站是否仍然正常运行,并且您没有删除相关图像。 如果出现问题,请不要担心:您应该备份您的数据库和wp-content文件夹,这样您就应该能够将您的网站恢复到之前的状态。
如果您在使用 SQL 和数据库时遇到问题,或者您不理解我在这里解释的任何内容,请先在下面写下评论让我知道。 之后,尝试使用 Media Cleaner 之类的插件。 您将获得的最终结果必须与我们在这篇文章中看到的非常相似。
Gary Chan在Unsplash上的特色图片。
