WooCommerce可变产品更新时如何获取历史价格用于对比?
WooCommerce可变产品更新时获取新旧价格的解决方案
问题描述
在WooCommerce中管理可变产品时,需要在更新价格的同时获取新旧价格进行对比,但现有的woocommerce_admin_process_variation_object、woocommerce_before_save_product_variation等钩子仅能获取新价格,无法直接拿到历史价格。修改核心文件虽能实现,但不符合开发规范,因此需要合规的解决方案。已尝试过woocommerce_update_product_variation、woocommerce_before_save_product_variation、wp_ajax_woocommerce_remove_variations、woocommerce_save_product_variation等钩子,均未达到需求。
可行解决方案
方法一:利用woocommerce_before_save_product_variation钩子读取数据库原始价格
在变体保存前,直接从数据库中读取未修改的旧价格,再与即将保存的新价格对比:
add_action('woocommerce_before_save_product_variation', 'compare_variation_prices_before_save', 10, 2); function compare_variation_prices_before_save($variation, $product) { // 获取数据库中存储的旧价格 $old_price = get_post_meta($variation->get_id(), '_price', true); // 获取当前待保存的新价格 $new_price = $variation->get_price(); // 执行新旧价格对比逻辑 if ($old_price !== $new_price && !empty($new_price)) { // 示例:记录价格变更日志 error_log("变体ID {$variation->get_id()} 价格更新:旧价 {$old_price} → 新价 {$new_price}"); // 这里可以添加自定义业务逻辑,比如发送通知、记录到自定义表等 } }
方法二:通过wp_update_post钩子捕获变体更新前的原始数据
产品变体属于自定义文章类型,可借助WordPress原生的wp_update_post钩子,在更新触发时获取旧价格:
add_action('wp_update_post', 'compare_variation_prices_on_update', 10, 2); function compare_variation_prices_on_update($post_id, $post_before) { // 验证当前更新的是产品变体 if (get_post_type($post_id) !== 'product_variation') { return; } // 获取旧价格 $old_price = get_post_meta($post_id, '_price', true); // 从POST数据中获取待保存的新价格(需做安全过滤) $new_price = isset($_POST['_price']) ? wc_clean($_POST['_price']) : ''; if ($old_price !== $new_price && !empty($new_price)) { // 执行对比逻辑 error_log("变体ID {$post_id} 价格变更:旧价 {$old_price} → 新价 {$new_price}"); } }
注意事项
- 两种方法均无需修改WooCommerce核心文件,符合官方开发规范
- 使用
$_POST获取新价格时,必须用wc_clean()进行安全过滤,避免恶意数据注入 - 若需处理批量更新场景,需确保逻辑能兼容批量操作的参数传递
内容的提问来源于stack exchange,提问作者wprah
相关产品推荐
相关产品推荐

