结帐前更改购物车项目订阅属性值
Change cart items subscription properties values before checkout
这可能是一个菜鸟问题,所以提前致歉。
我有可变订阅产品,其价格因订阅时长而异。我还有一个 subscription_length = 0 的简单订阅。当购物车包含这两种类型时,Woocommerce 订阅会创建两个订阅。
我正在尝试修改购物车中所有商品的 subscription_length 元数据以匹配购物车中的最长长度,因此只会创建一个订阅。
我似乎找不到更新购物车的正确方法。这可能只是愚蠢的人类 PHP 把戏。
这是声明的最新变体,目前不起作用:
$cart[$item_key]['data']->subscription_length = $maxlength;
我已经尝试了十几种或更多主题变体来更新 $cart 数据。有些失败,有些成功,但 $cart 中的数据没有改变。
function csi_align_subscription_length() {
$maxlength = 0;
$cart = WC()->cart->get_cart();
//find the longest length
foreach ( $cart as $item_key => $item ){
if ( WC_Subscriptions_Product::is_subscription( $item['data'] ) ) {
$length = WC_Subscriptions_Product::get_length( $item['data'] );
$maxlength = ($length > $maxlength) ? $length : $maxlength ; //get the longest length
}
}
//set all subscription lengths to the longest lengths
foreach ( $cart as $item_key => $item ){
if ( WC_Subscriptions_Product::is_subscription( $item['data'] ) ) {
echo '<pre>';
echo "cart-item before: ". var_dump($cart[$item_key]);
$cart[$item_key]['data']->subscription_length = $maxlength;
echo "cart-item after: ".var_dump($cart[$item_key]);
echo '</pre>';
}
}
WC()->cart->set_cart_contents($cart);
}
add_filter( 'woocommerce_subscription_cart_before_grouping', 'csi_align_subscription_length', 10, 1 );
我只需要让购物车中的订阅与一个公共组保持一致,因此我每次结帐时只有 1 个订单和 1 个订阅。如果我迷失了切线,我愿意采用不同的方法。
已更新 (适用于简单订阅和订阅变体(可变订阅)
挂钩 woocommerce_before_calculate_totals
允许更改购物车项目的产品属性。由于 woocommerce 3 and CRUD Objects,无法直接访问对象属性,您将不得不使用可用的 getter 和 setter 方法来代替……这里我们:
- 仅获取所有订阅购物车项目的长度数组。
- 获取最大长度值
- 仅为所有订阅购物车项目设置最大长度值。
所需代码:
add_action( 'woocommerce_before_calculate_totals', 'before_calculate_totals_action_callback', 10, 1 );
function before_calculate_totals_action_callback( $cart ) {
if ( ( is_admin() && ! defined( 'DOING_AJAX' ) ) )
return;
if ( did_action( 'woocommerce_before_calculate_totals' ) >= 2 )
return;
$maxlength = []; // Initializing
// First loop (get)
foreach ( $cart->get_cart() as $cart_item ){
if ( in_array( $cart_item['data']->get_type(), array('subscription', 'subscription_variation') ) ) {
$maxlength[] = (float) $cart_item['data']->get_length();
}
}
// Get the highest value
$maxlength = max($maxlength);
// Second loop (set)
foreach ( $cart->get_cart() as $cart_item ){
if ( is_a( $cart_item['data'], 'WC_Product_Subscription' ) || is_a( $cart_item['data'], 'WC_Product_Subscription_Variation' ) ) {
$cart_item['data']->set_length( $maxlength );
}
}
}
代码进入您的活动子主题(或活动主题)的 function.php 文件。已测试并有效。
注意:提交订单时,一定要设置购物车商品(自定义)长度为自定义订单商品meta数据.
问题终于解决了。 'subscription_length' 没有 setter。不得不使用 update_meta_data 方法。元键是“_subscription_length”。以下代码有效。
function csi_align_subscription_length( $cart ) {
if ( ( is_admin() && ! defined( 'DOING_AJAX' ) ) )
return;
if ( did_action( 'woocommerce_before_calculate_totals' ) >= 2 )
return;
$maxlength = (float) 0;
// Find the longest subscription length
foreach ( $cart->get_cart() as $cart_item ){
if ( is_a( $cart_item['data'], 'WC_Product_Subscription' ) || is_a( $cart_item['data'], 'WC_Product_Subscription_Variation' ) ) {
$length = (float) WC_Subscriptions_Product::get_length( $cart_item['data'] );
$maxlength = ($length > $maxlength) ? $length : $maxlength ; //get the longest length
}
}
// set the subscription length for everything in the cart
foreach ( $cart->get_cart() as $item_key => $cart_item ){
if ( is_a( $cart_item['data'], 'WC_Product_Subscription' ) || is_a( $cart_item['data'], 'WC_Product_Subscription_Variation' )) {
$cart_item['data']->update_meta_data( '_subscription_length', $maxlength );
}
}
}
add_action( 'woocommerce_before_calculate_totals', 'csi_align_subscription_length', 5, 1 );
这可能是一个菜鸟问题,所以提前致歉。
我有可变订阅产品,其价格因订阅时长而异。我还有一个 subscription_length = 0 的简单订阅。当购物车包含这两种类型时,Woocommerce 订阅会创建两个订阅。
我正在尝试修改购物车中所有商品的 subscription_length 元数据以匹配购物车中的最长长度,因此只会创建一个订阅。
我似乎找不到更新购物车的正确方法。这可能只是愚蠢的人类 PHP 把戏。
这是声明的最新变体,目前不起作用:
$cart[$item_key]['data']->subscription_length = $maxlength;
我已经尝试了十几种或更多主题变体来更新 $cart 数据。有些失败,有些成功,但 $cart 中的数据没有改变。
function csi_align_subscription_length() {
$maxlength = 0;
$cart = WC()->cart->get_cart();
//find the longest length
foreach ( $cart as $item_key => $item ){
if ( WC_Subscriptions_Product::is_subscription( $item['data'] ) ) {
$length = WC_Subscriptions_Product::get_length( $item['data'] );
$maxlength = ($length > $maxlength) ? $length : $maxlength ; //get the longest length
}
}
//set all subscription lengths to the longest lengths
foreach ( $cart as $item_key => $item ){
if ( WC_Subscriptions_Product::is_subscription( $item['data'] ) ) {
echo '<pre>';
echo "cart-item before: ". var_dump($cart[$item_key]);
$cart[$item_key]['data']->subscription_length = $maxlength;
echo "cart-item after: ".var_dump($cart[$item_key]);
echo '</pre>';
}
}
WC()->cart->set_cart_contents($cart);
}
add_filter( 'woocommerce_subscription_cart_before_grouping', 'csi_align_subscription_length', 10, 1 );
我只需要让购物车中的订阅与一个公共组保持一致,因此我每次结帐时只有 1 个订单和 1 个订阅。如果我迷失了切线,我愿意采用不同的方法。
已更新 (适用于简单订阅和订阅变体(可变订阅)
挂钩 woocommerce_before_calculate_totals
允许更改购物车项目的产品属性。由于 woocommerce 3 and CRUD Objects,无法直接访问对象属性,您将不得不使用可用的 getter 和 setter 方法来代替……这里我们:
- 仅获取所有订阅购物车项目的长度数组。
- 获取最大长度值
- 仅为所有订阅购物车项目设置最大长度值。
所需代码:
add_action( 'woocommerce_before_calculate_totals', 'before_calculate_totals_action_callback', 10, 1 );
function before_calculate_totals_action_callback( $cart ) {
if ( ( is_admin() && ! defined( 'DOING_AJAX' ) ) )
return;
if ( did_action( 'woocommerce_before_calculate_totals' ) >= 2 )
return;
$maxlength = []; // Initializing
// First loop (get)
foreach ( $cart->get_cart() as $cart_item ){
if ( in_array( $cart_item['data']->get_type(), array('subscription', 'subscription_variation') ) ) {
$maxlength[] = (float) $cart_item['data']->get_length();
}
}
// Get the highest value
$maxlength = max($maxlength);
// Second loop (set)
foreach ( $cart->get_cart() as $cart_item ){
if ( is_a( $cart_item['data'], 'WC_Product_Subscription' ) || is_a( $cart_item['data'], 'WC_Product_Subscription_Variation' ) ) {
$cart_item['data']->set_length( $maxlength );
}
}
}
代码进入您的活动子主题(或活动主题)的 function.php 文件。已测试并有效。
注意:提交订单时,一定要设置购物车商品(自定义)长度为自定义订单商品meta数据.
问题终于解决了。 'subscription_length' 没有 setter。不得不使用 update_meta_data 方法。元键是“_subscription_length”。以下代码有效。
function csi_align_subscription_length( $cart ) {
if ( ( is_admin() && ! defined( 'DOING_AJAX' ) ) )
return;
if ( did_action( 'woocommerce_before_calculate_totals' ) >= 2 )
return;
$maxlength = (float) 0;
// Find the longest subscription length
foreach ( $cart->get_cart() as $cart_item ){
if ( is_a( $cart_item['data'], 'WC_Product_Subscription' ) || is_a( $cart_item['data'], 'WC_Product_Subscription_Variation' ) ) {
$length = (float) WC_Subscriptions_Product::get_length( $cart_item['data'] );
$maxlength = ($length > $maxlength) ? $length : $maxlength ; //get the longest length
}
}
// set the subscription length for everything in the cart
foreach ( $cart->get_cart() as $item_key => $cart_item ){
if ( is_a( $cart_item['data'], 'WC_Product_Subscription' ) || is_a( $cart_item['data'], 'WC_Product_Subscription_Variation' )) {
$cart_item['data']->update_meta_data( '_subscription_length', $maxlength );
}
}
}
add_action( 'woocommerce_before_calculate_totals', 'csi_align_subscription_length', 5, 1 );