是否存在可捕获WooCommerce产品图片更新的WordPress钩子?多供应商站点下仅图片更新时触发邮件通知的实现方法
实现仅在产品图片更新时发送通知的方案
当然可以实现!你当前使用的woocommerce_update_product钩子确实会在产品的任何字段(标题、库存、描述等)更新时触发,所以我们需要添加一个「图片对比」的逻辑,只有当产品的主图或画廊图片真的发生变化时,才执行邮件发送操作。
下面是具体的实现代码,我会一步步解释逻辑:
完整代码示例
// 保存更新前的产品图片数据,用于后续对比 add_action('woocommerce_before_product_object_save', 'store_old_product_images', 10, 2); function store_old_product_images($product, $data_store) { // 收集主图ID和画廊图片ID数组 $old_image_data = array( 'featured_id' => $product->get_image_id(), 'gallery_ids' => $product->get_gallery_image_ids() ); // 用全局变量临时存储,也可以用WP缓存替代(更推荐) global $_temp_old_product_images; $_temp_old_product_images[$product->get_id()] = $old_image_data; } // 产品更新后对比图片数据,变化则发送邮件 add_action('woocommerce_update_product', 'trigger_email_on_image_change', 10, 1); function trigger_email_on_image_change($product_id) { global $_temp_old_product_images; // 如果没有旧图片数据(比如产品刚创建),直接返回 if (!isset($_temp_old_product_images[$product_id])) { return; } $product = wc_get_product($product_id); // 获取更新后的图片数据 $new_image_data = array( 'featured_id' => $product->get_image_id(), 'gallery_ids' => $product->get_gallery_image_ids() ); $old_image_data = $_temp_old_product_images[$product_id]; $images_have_changed = false; // 1. 对比主图是否变化 if ($old_image_data['featured_id'] !== $new_image_data['featured_id']) { $images_have_changed = true; } // 2. 对比画廊图片是否变化(顺序不同也视为变化,若不需要可改用array_diff) if (!$images_have_changed && $old_image_data['gallery_ids'] !== $new_image_data['gallery_ids']) { $images_have_changed = true; } // 如果图片确实变化,执行邮件发送逻辑 if ($images_have_changed) { // 这里替换成你的邮件配置 $recipient_email = 'your-notification-email@example.com'; $email_subject = sprintf('供应商更新了产品图片:%s', $product->get_name()); $email_content = sprintf( '产品ID:%d\n产品名称:%s\n查看产品:%s', $product_id, $product->get_name(), $product->get_permalink() ); // 使用WP内置函数发送邮件 wp_mail($recipient_email, $email_subject, $email_content); // 清理临时变量,避免后续冲突 unset($_temp_old_product_images[$product_id]); } }
代码逻辑说明
保存旧图片数据:
我们用woocommerce_before_product_object_save钩子(在产品保存到数据库前触发),把更新前的主图ID和画廊图片ID数组存到临时变量里,这样就能和更新后的图片数据做对比。对比图片变化:
在woocommerce_update_product钩子中,我们取出更新后的图片数据,分别对比主图ID和画廊图片数组:- 主图ID不同直接判定为变化;
- 画廊图片数组如果内容或顺序不同,也判定为变化(如果你觉得顺序不同不算变化,可以用
array_diff($old_ids, $new_ids)来检测是否有新增/删除的图片)。
发送通知邮件:
只有当图片确实变化时,才执行wp_mail发送邮件,你可以根据需求自定义收件人、邮件主题和内容。
额外注意事项
- 对于WC Marketplace,供应商修改产品的流程本质还是调用WooCommerce的产品更新API,所以这些钩子完全适用;
- 如果担心全局变量的冲突问题,可以把全局变量替换为WP缓存:用
wp_cache_set($product_id, $old_image_data, 'temp_product_images')存储,wp_cache_get($product_id, 'temp_product_images')获取; - 测试时,可以先修改产品标题/库存,确认不会触发邮件,再修改图片验证邮件是否正常发送。
内容的提问来源于stack exchange,提问作者Fredric Dael
相关产品推荐
相关产品推荐

