返回

告别图片堆积:彻底删除 WooCommerce 产品图片

php

删除 WooCommerce 产品图片:彻底清除文件系统

问题:图片堆积

当你通过 WooCommerce 产品页面删除产品图片时,它们并不会从媒体库和文件系统中删除。这会导致大量未使用的图片在系统中积累,占用宝贵的存储空间,甚至影响网站性能。

解决方案:同步删除

要解决这一问题,我们需要确保在删除产品图片时,它们也从文件系统中同步删除。为此,我们将使用 WooCommerce 的内建钩子 woocommerce_update_product

具体步骤:

  1. 在主题的 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 产品图片时,它们也会从文件系统中同步删除。这将极大地优化你的网站存储,提高性能,并防止图片堆积。

常见问题解答:

  1. 这适用于所有 WooCommerce 版本吗?
    是,该代码与所有 WooCommerce 版本兼容。

  2. 为什么我的图片没有删除?
    检查以下情况:

    • 服务器权限问题
    • 图片存储在其他元数据字段中
    • WooCommerce 设置配置不正确
  3. 我可以删除非产品图片吗?
    不可以,此代码仅删除产品图片。

  4. 如何还原已删除的图片?
    从备份中恢复或重新上传图片。

  5. 还有其他优化文件系统的方法吗?

    • 定期清理垃圾文件
    • 启用缓存插件
    • 使用图像优化工具