如何修改WooCommerce购物车中YITH订阅产品的续费价格
修改YITH Subscription插件的续费价格
你当前的代码仅能修改订阅产品的初始价格(首月周期),但YITH Subscription的续费价格是单独存储和计算的,不会跟随产品的常规价格变动。要修改续费价格,需要针对订阅专属的参数或钩子进行调整,以下是两种可行方案:
方案1:在购物车计算时直接更新续费价格
在现有代码修改初始价格的逻辑后,同步更新购物车项中的续费价格参数,确保首月和续费价格保持一致(或按你的需求自定义)。修改后的完整代码如下:
add_action('woocommerce_before_calculate_totals', 'add_product_to_cart_on_update'); function add_product_to_cart_on_update($cart) { if (is_admin() && ! defined('DOING_AJAX')) { return; } if ( did_action( 'woocommerce_before_calculate_totals' ) >= 2 ) return; $product_id_to_add = get_field('subscription_product', 'option'); $sale_qty = get_field('number_of_sensors', 'option'); $qty = 0; $found = false; $product_cart_key_to_add = ''; $sensor_products = array(); // 遍历购物车收集传感器产品数据 foreach ($cart->get_cart() as $cart_item_key => $cart_item) { $product_id = $cart_item['product_id']; $product_qty = $cart_item['quantity']; $is_sensor_product = get_post_meta($product_id, '_sensor_product', true); if ($is_sensor_product === 'yes') { $sensor_products[$cart_item_key]['qty'] = $product_qty; } if ($product_id_to_add == $product_id) { $found = true; $product_cart_key_to_add = $cart_item_key; } } // 计算传感器产品总数量 foreach ($sensor_products as $sensor_p) { $qty += $sensor_p['qty']; } // 获取订阅产品对象 $product = wc_get_product($product_id_to_add); if (!$product || !$product->is_type('subscription')) return; $target_price = $product->get_regular_price(); // 数量达标时使用促销价格(如果有) if ($sale_qty != null && $qty >= $sale_qty) { $target_price = $product->get_sale_price() ?: $target_price; } if ($found) { // 更新订阅产品数量 $cart->set_quantity($product_cart_key_to_add, $qty); // 修改初始价格 $cart->get_cart_item($product_cart_key_to_add)['data']->set_price($target_price); // 修改续费价格 $cart_item = $cart->get_cart_item($product_cart_key_to_add); $cart_item['yith_subscription_recurring_price'] = $target_price; $cart->cart_contents[$product_cart_key_to_add] = $cart_item; } else { // 添加订阅产品到购物车 if ($qty > 0) { $cart_item_key = $cart->add_to_cart($product_id_to_add, $qty); // 修改初始价格和续费价格 $cart->get_cart_item($cart_item_key)['data']->set_price($target_price); $cart_item = $cart->get_cart_item($cart_item_key); $cart_item['yith_subscription_recurring_price'] = $target_price; $cart->cart_contents[$cart_item_key] = $cart_item; } } }
方案2:使用YITH专属钩子全局修改续费价格
如果需要更灵活地控制续费价格(比如在多个场景生效),可以使用YITH提供的yith_wc_subscription_recurring_price钩子,全局调整订阅产品的续费价格:
add_filter('yith_wc_subscription_recurring_price', 'custom_yith_subscription_recurring_price', 10, 3); function custom_yith_subscription_recurring_price($recurring_price, $product, $cart_item) { // 仅针对目标订阅产品生效 $product_id_to_add = get_field('subscription_product', 'option'); if ($product->get_id() != $product_id_to_add) return $recurring_price; // 计算购物车中传感器产品总数量 $qty = 0; foreach (WC()->cart->get_cart() as $item) { $is_sensor_product = get_post_meta($item['product_id'], '_sensor_product', true); if ($is_sensor_product === 'yes') { $qty += $item['quantity']; } } $sale_qty = get_field('number_of_sensors', 'option'); // 根据传感器数量调整续费价格 if ($sale_qty != null && $qty < $sale_qty) { return $product->get_regular_price(); } else { // 数量达标时使用促销价格(如果有) return $product->get_sale_price() ?: $product->get_regular_price(); } }
注意事项
- 确保目标产品是YITH订阅类型产品,代码中已加入
is_type('subscription')判断; - 如果你需要不同的初始价格和续费价格,只需调整
target_price或钩子中的返回值即可; - 测试时请清空购物车缓存,避免旧数据干扰。
内容的提问来源于stack exchange,提问作者hesham shawky
相关产品推荐
相关产品推荐

