清理调整wordpress产品缩略图规格以及其他尺寸 避免占用过多和过大空间

实现目标

  1. 遍历所有 WooCommerce 产品
    • 查找每个产品的主图及画廊图片。
  2. 更新所有图片的缩略图元数据
    • 替换旧的缩略图规格(如 -650x650)为原始图片路径。
  3. 清理并刷新所有图片的缓存
    • 确保更新的图片立即生效。
add_action('init', 'update_all_product_images');
function update_all_product_images() {
    if (!is_admin()) {
        return;
    }

    global $wpdb;

    // 调试开始
    error_log("=== Global Product Image Update Start ===");

    // 获取所有产品 ID
    $product_ids = $wpdb->get_col("
        SELECT ID 
        FROM {$wpdb->posts} 
        WHERE post_type = 'product' AND post_status = 'publish'
    ");

    if (empty($product_ids)) {
        error_log("No products found.");
        return;
    }

    error_log("Found product IDs: " . implode(', ', $product_ids));

    // 遍历每个产品
    foreach ($product_ids as $product_id) {
        error_log("Processing Product ID: {$product_id}");

        // 获取产品的所有图片附件 ID
        $attachment_ids = $wpdb->get_col($wpdb->prepare(
            "SELECT ID 
             FROM {$wpdb->posts} 
             WHERE post_parent = %d AND post_type = 'attachment' AND post_mime_type LIKE 'image/%%'",
            $product_id
        ));

        if (empty($attachment_ids)) {
            error_log("No attachments found for product ID: {$product_id}");
            continue;
        }

        error_log("Found attachment IDs for Product ID {$product_id}: " . implode(', ', $attachment_ids));

        // 遍历所有附件并更新元数据
        foreach ($attachment_ids as $attachment_id) {
            $sizes_to_replace = ['-650x650.', '-300x300.', '-150x150.'];
            foreach ($sizes_to_replace as $size) {
                $update_result = $wpdb->query($wpdb->prepare(
                    "UPDATE {$wpdb->postmeta} 
                     SET meta_value = REPLACE(meta_value, %s, '.') 
                     WHERE post_id = %d AND meta_value LIKE %s",
                    $size, $attachment_id, '%' . $size . '%'
                ));
                error_log("Updated Meta Data for Attachment ID {$attachment_id} with size {$size}: {$update_result}");
            }

            // 清除缓存
            clean_post_cache($attachment_id);
        }

        // 更新产品主图缩略图规格
        $thumbnail_id = get_post_thumbnail_id($product_id);
        if ($thumbnail_id) {
            error_log("Updating Thumbnail ID for Product ID {$product_id}: {$thumbnail_id}");

            foreach ($sizes_to_replace as $size) {
                $update_thumbnail_result = $wpdb->query($wpdb->prepare(
                    "UPDATE {$wpdb->postmeta} 
                     SET meta_value = REPLACE(meta_value, %s, '.') 
                     WHERE post_id = %d AND meta_value LIKE %s",
                    $size, $thumbnail_id, '%' . $size . '%'
                ));
                error_log("Updated Thumbnail ID {$thumbnail_id} with size {$size}: {$update_thumbnail_result}");
            }

            clean_post_cache($thumbnail_id);
        }
    }

    // 清理并刷新所有缩略图缓存
    wp_cache_flush();

    error_log("=== Global Product Image Update End ===");
}

代码解读

  1. 遍历所有产品
    • 从数据库中查询所有发布状态的 WooCommerce 产品。
  2. 获取图片附件
    • 查找每个产品关联的图片,包括主图和画廊图片。
  3. 更新图片元数据
    • 对每张图片元数据中的缩略图规格(如 -650x650)进行替换。
  4. 清理缓存
    • 调用 clean_post_cachewp_cache_flush 清理图片缓存,使更新生效。

使用方法

  1. 将代码添加到主题的 functions.php 文件
  2. 访问 WordPress 后台,代码会自动运行。
  3. 检查日志文件
    • 查看 debug.log 以确保所有图片均被成功处理。

注意事项

  1. 数据库操作安全
    • 修改前务必备份数据库,因为代码会直接更新 wp_postmeta 表中的数据。
  2. 处理大批量数据
    • 如果产品数量和图片较多,运行时间可能较长,建议分批处理或增加服务器执行时间限制。
  3. 缩略图重建
    • 若需确保所有图片规格更新无误,建议使用 Regenerate Thumbnails 插件重新生成缩略图。

By 行政