目录
实现目标
- 遍历所有 WooCommerce 产品:
- 查找每个产品的主图及画廊图片。
- 更新所有图片的缩略图元数据:
- 替换旧的缩略图规格(如
-650x650
)为原始图片路径。
- 替换旧的缩略图规格(如
- 清理并刷新所有图片的缓存:
- 确保更新的图片立即生效。
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 ===");
}
代码解读
- 遍历所有产品:
- 从数据库中查询所有发布状态的 WooCommerce 产品。
- 获取图片附件:
- 查找每个产品关联的图片,包括主图和画廊图片。
- 更新图片元数据:
- 对每张图片元数据中的缩略图规格(如
-650x650
)进行替换。
- 对每张图片元数据中的缩略图规格(如
- 清理缓存:
- 调用
clean_post_cache
和wp_cache_flush
清理图片缓存,使更新生效。
- 调用
使用方法
- 将代码添加到主题的
functions.php
文件。 - 访问 WordPress 后台,代码会自动运行。
- 检查日志文件:
- 查看
debug.log
以确保所有图片均被成功处理。
- 查看
注意事项
- 数据库操作安全:
- 修改前务必备份数据库,因为代码会直接更新
wp_postmeta
表中的数据。
- 修改前务必备份数据库,因为代码会直接更新
- 处理大批量数据:
- 如果产品数量和图片较多,运行时间可能较长,建议分批处理或增加服务器执行时间限制。
- 缩略图重建:
- 若需确保所有图片规格更新无误,建议使用 Regenerate Thumbnails 插件重新生成缩略图。