返回
告别图片堆积:彻底删除 WooCommerce 产品图片
php
2024-03-11 23:54:57
删除 WooCommerce 产品图片:彻底清除文件系统
问题:图片堆积
当你通过 WooCommerce 产品页面删除产品图片时,它们并不会从媒体库和文件系统中删除。这会导致大量未使用的图片在系统中积累,占用宝贵的存储空间,甚至影响网站性能。
解决方案:同步删除
要解决这一问题,我们需要确保在删除产品图片时,它们也从文件系统中同步删除。为此,我们将使用 WooCommerce 的内建钩子 woocommerce_update_product
。
具体步骤:
- 在主题的
functions.php
文件中添加以下代码:
add_action('woocommerce_update_product', 'action_save_product_data', 10, 2);
function action_save_product_data($post_id, $product) {
// 确保仅处理产品更新
if ('product' == get_post_type()) {
global $previous_product_id;
global $before;
// 储存前一个产品图片库 ID
if ($previous_product_id === $post_id) {
$after = wc_get_product($post_id)->gallery_image_ids;
}
// 更新前一个产品 ID 和旧图片库 ID
if ($previous_product_id === $post_id) {
null;
} else {
$before = wc_get_product($post_id)->gallery_image_ids;
}
// 计算需要删除的图片 ID
if ($previous_product_id === $post_id) {
$images_to_be_deleted = array_diff($before, $after);
// 删除图片
foreach ($images_to_be_deleted as $delete) {
wp_delete_attachment($delete, $force_delete = true);
}
}
// 更新前一个产品 ID
$previous_product_id = $post_id;
}
}
代码解析:
- 第 2-4 行: 注册
woocommerce_update_product
钩子,当产品更新时运行我们的函数。 - 第 6-14 行: 使用全局变量
$previous_product_id
和$before
在更新之前和之后存储产品图片库 ID。 - 第 16-28 行: 检查当前产品 ID 是否与前一个产品 ID 相同。如果是,则计算需要删除的图片 ID(
$images_to_be_deleted
)。 - 第 30-34 行: 逐个删除这些图片,使用
wp_delete_attachment()
函数。 - 第 36-38 行: 更新前一个产品 ID,以便在下次更新时继续监控。
注意事项:
- 确保服务器有删除文件所需的权限。
- 代码中使用的
gallery_image_ids
方法假定你的产品图片存储在画廊中。 - 如果你的图片存储在其他元数据字段中,需要相应地修改代码。
结论:告别图片堆积
通过实施这些步骤,你可以确保在删除 WooCommerce 产品图片时,它们也会从文件系统中同步删除。这将极大地优化你的网站存储,提高性能,并防止图片堆积。
常见问题解答:
-
这适用于所有 WooCommerce 版本吗?
是,该代码与所有 WooCommerce 版本兼容。 -
为什么我的图片没有删除?
检查以下情况:- 服务器权限问题
- 图片存储在其他元数据字段中
- WooCommerce 设置配置不正确
-
我可以删除非产品图片吗?
不可以,此代码仅删除产品图片。 -
如何还原已删除的图片?
从备份中恢复或重新上传图片。 -
还有其他优化文件系统的方法吗?
- 定期清理垃圾文件
- 启用缓存插件
- 使用图像优化工具