在 WooCommerce 中以编程方式自动将礼品产品变体添加到购物车?
Auto add to cart a Gift product variation programmatically in WooCommerce?
我正在尝试在有人将产品添加到购物车时为 woocommerce 创建买一送一优惠。下面的代码有效,但仅适用于简单的产品,我尝试将变体 ID
添加到变量,但它不起作用。有任何想法吗?感谢社区
add_action( 'template_redirect', 'bbloomer_add_gift_if_id_in_cart' );
function bbloomer_add_gift_if_id_in_cart() {
if ( is_admin() ) return;
if ( WC()->cart->is_empty() ) return;
$product_bought_id = 421;
$product_gifted_id = 1256;
// see if product id in cart
$product_bought_cart_id = WC()->cart->generate_cart_id( $product_bought_id );
$product_bought_in_cart = WC()->cart->find_product_in_cart( $product_bought_cart_id );
// see if gift id in cart
$product_gifted_cart_id = WC()->cart->generate_cart_id( $product_gifted_id );
$product_gifted_in_cart = WC()->cart->find_product_in_cart( $product_gifted_cart_id );
// if not in cart remove gift, else add gift
if ( ! $product_bought_in_cart ) {
if ( $product_gifted_in_cart ) WC()->cart->remove_cart_item( $product_gifted_in_cart );
} else {
if ( ! $product_gifted_in_cart ) WC()->cart->add_to_cart( $product_gifted_id );
}
}
要将产品变体添加到购物车,您需要父变量产品 ID 和产品变体 ID(两者)。
现在您使用的代码已过时,如果客户在购物车页面更新购物车,删除所需的产品 ID,则该代码将无法使用。在这种情况下,Gift 产品将在重新加载页面或跳转到另一个页面后被删除。所以 template_redirect
不是要使用的正确钩子。
试试下面的方法,它也能处理简单的产品和产品变体:
add_action( 'woocommerce_before_calculate_totals', 'wc_auto_add_gift_to_cart' );
function wc_auto_add_gift_to_cart( $cart ) {
if (is_admin() && !defined('DOING_AJAX'))
return;
$required_product_id = 37; // The required product Id (or variation Id)
$parent_gift_id = 40; // The parent variable product Id (gift) for a product variation (set to zero for simple products)
$product_gift_id = 41; // the variation Id or the product Id (gift)
$has_required = $gift_key = false; // Initializing
foreach ( $cart->get_cart() as $cart_item_key => $cart_item ) {
// Check if required product is in cart
if( in_array( $required_product_id, array($cart_item['product_id'], $cart_item['variation_id']) ) ) {
$has_required = true;
}
// Check if gifted product is already in cart
if( $cart_item['data']->get_id() == $product_gift_id ) {
$gift_key = $cart_item_key;
}
}
// If gift is in cart, but not the required product: Remove gift from cart
if ( ! $has_required && $gift_key ) {
$cart->remove_cart_item( $gift_key );
}
// If gift is not in cart and the required product is in cart: Add gift to cart
elseif ( $has_required && ! $gift_key ) {
// For simple products
if( $parent_gift_id == 0 ) {
$cart->add_to_cart( $product_gift_id );
}
// For product variations (of a variable product)
else {
$cart->add_to_cart( $parent_gift_id, 1, $product_gift_id );
}
}
}
代码进入您的活动子主题(或活动主题)的 functions.php 文件。已测试并有效。
我正在尝试在有人将产品添加到购物车时为 woocommerce 创建买一送一优惠。下面的代码有效,但仅适用于简单的产品,我尝试将变体 ID
添加到变量,但它不起作用。有任何想法吗?感谢社区
add_action( 'template_redirect', 'bbloomer_add_gift_if_id_in_cart' );
function bbloomer_add_gift_if_id_in_cart() {
if ( is_admin() ) return;
if ( WC()->cart->is_empty() ) return;
$product_bought_id = 421;
$product_gifted_id = 1256;
// see if product id in cart
$product_bought_cart_id = WC()->cart->generate_cart_id( $product_bought_id );
$product_bought_in_cart = WC()->cart->find_product_in_cart( $product_bought_cart_id );
// see if gift id in cart
$product_gifted_cart_id = WC()->cart->generate_cart_id( $product_gifted_id );
$product_gifted_in_cart = WC()->cart->find_product_in_cart( $product_gifted_cart_id );
// if not in cart remove gift, else add gift
if ( ! $product_bought_in_cart ) {
if ( $product_gifted_in_cart ) WC()->cart->remove_cart_item( $product_gifted_in_cart );
} else {
if ( ! $product_gifted_in_cart ) WC()->cart->add_to_cart( $product_gifted_id );
}
}
要将产品变体添加到购物车,您需要父变量产品 ID 和产品变体 ID(两者)。
现在您使用的代码已过时,如果客户在购物车页面更新购物车,删除所需的产品 ID,则该代码将无法使用。在这种情况下,Gift 产品将在重新加载页面或跳转到另一个页面后被删除。所以 template_redirect
不是要使用的正确钩子。
试试下面的方法,它也能处理简单的产品和产品变体:
add_action( 'woocommerce_before_calculate_totals', 'wc_auto_add_gift_to_cart' );
function wc_auto_add_gift_to_cart( $cart ) {
if (is_admin() && !defined('DOING_AJAX'))
return;
$required_product_id = 37; // The required product Id (or variation Id)
$parent_gift_id = 40; // The parent variable product Id (gift) for a product variation (set to zero for simple products)
$product_gift_id = 41; // the variation Id or the product Id (gift)
$has_required = $gift_key = false; // Initializing
foreach ( $cart->get_cart() as $cart_item_key => $cart_item ) {
// Check if required product is in cart
if( in_array( $required_product_id, array($cart_item['product_id'], $cart_item['variation_id']) ) ) {
$has_required = true;
}
// Check if gifted product is already in cart
if( $cart_item['data']->get_id() == $product_gift_id ) {
$gift_key = $cart_item_key;
}
}
// If gift is in cart, but not the required product: Remove gift from cart
if ( ! $has_required && $gift_key ) {
$cart->remove_cart_item( $gift_key );
}
// If gift is not in cart and the required product is in cart: Add gift to cart
elseif ( $has_required && ! $gift_key ) {
// For simple products
if( $parent_gift_id == 0 ) {
$cart->add_to_cart( $product_gift_id );
}
// For product variations (of a variable product)
else {
$cart->add_to_cart( $parent_gift_id, 1, $product_gift_id );
}
}
}
代码进入您的活动子主题(或活动主题)的 functions.php 文件。已测试并有效。