以编程方式删除WooCommerce产品


Removing WooCommerce Product programmatically

目前,如果一个商品进入客户的购物车,我将动态添加一个产品+优惠券。

// add Sufficiency Naked Calories to cart
add_action( 'wp_loaded', 'wc_custom_add_to_cart', 80 );
function wc_custom_add_to_cart( $product )
{
    if (is_admin()) {
        return;
    }
    $cart = WC()->cart->get_cart();
    $products_to_check = array(10305, 10302, 10300, 10303, 10301);
    $book = 10311;
    $coupon_code = 'nutreincesufficiencyquiznakedcalories';
    foreach ($cart as $cart_item_key => $values) {
        $_product = $values['data'];
        if ($_product->id == $book) return; // product has already been added
        if (in_array($_product->id, $products_to_check)) {
            WC()->cart->add_to_cart($book);
            WC()->cart->add_discount($coupon_code);
            break;
        }
    }
}

我想写一个函数,如果数组$products_to_check中的任何一项离开购物车,则允许我删除$book

到目前为止,我的尝试都没有成功

add_action( 'wp_loaded', 'wc_custom_add_to_cart', 80 );
function wc_custom_add_to_cart( $product )
{
    if (is_admin()) {
        return;
    }
    $cart = WC()->cart->get_cart();
    $products_to_check = array(10305, 10302, 10300, 10303, 10301);
    $book = 10311;
    $coupon_code = 'nutreincesufficiencyquiznakedcalories';
    foreach ($cart as $cart_item_key => $values) {
        $_product = $values['data'];
        if ($_product->id == $book) return; // product has already been added
        if (in_array($_product->id, $products_to_check)) {
            WC()->cart->add_to_cart($book);
            WC()->cart->add_discount($coupon_code);
        }
        if (in_array($_product->id, $products_to_check)) {
            return;
        } else {
            WC()->cart->remove_cart_item($book);
        }
    }
}

尝试# 2

add_action( 'wp_loaded', 'wc_custom_add_to_cart', 80 );
    function wc_custom_add_to_cart( $product )
    {
        if (is_admin()) {
            return;
        }
        $cart = WC()->cart->get_cart();
        $nutreince_sufficiency = array(10305, 10302, 10300, 10303, 10301);
        $book = 10310;
        $nutincart = false;
        $coupon_code = 'nutreincesufficiencyquiznakedcalories';
        foreach ($cart as $cart_item_key => $values) {
            $_product = $values['data'];
            if (in_array($_product->id, $nutreince_sufficiency)) {
                $nutincart = true;
                break;
            }
        }
        if ($nutincart) {
            WC()->cart->add_to_cart($book);
            WC()->cart->add_discount($coupon_code);
        } else {
            echo $_product->id;
            WC()->cart->set_quantity($book, 0);
        }
    }

将商品从购物车中移除,书仍然留在那里。

尝试更改add_action优先级以覆盖您的函数

帮助链接

功能set_quantity要求使用$cart_item_key作为目标产品,而不是$_product_id

add_action( 'wp_loaded', 'wc_custom_add_to_cart', 80 );
function wc_custom_add_to_cart( $product )
{
    if (is_admin()) {
        return;
    }
    $cart = WC()->cart->get_cart();
    $nutreince_sufficiency = array(10305, 10302, 10300, 10303, 10301);
    $book = 10310;
    $nutincart = false;
    $book_cart_reference = 0;
    $coupon_code = 'nutreincesufficiencyquiznakedcalories';
    foreach ($cart as $cart_item_key => $values) {
        $_product = $values['data'];
        if (in_array($_product->id, $nutreince_sufficiency)) {
            $nutincart = true;
            break;
        }
        // get cart item key for $book
        if ( $_product->id == $book )
        {
                $book_cart_reference = $cart_item_key;
        }
    }
    if ($nutincart) {
        WC()->cart->add_to_cart($book);
        WC()->cart->add_discount($coupon_code);
    } else {
        WC()->cart->set_quantity($book_cart_reference, 0);
    }
}

在下面的示例中,我的目标是产品ID = 282,并检查当前购物车的总数。如果超过了$50的阈值,代码片段就循环遍历购物车中的商品,如果找到了商品就停止。在这个阶段,它存储了它的"购物车项键",最后使用remove_cart_item()函数来删除它。

add_action( 'template_redirect', 'remove_product_from_cart_programmatically' );
function remove_product_from_cart_programmatically() {
 if ( is_admin() ) return;
     $product_id = 282; // product id
     $cart_total = 50; // replace with threshold
     $in_cart = false;
 foreach( WC()->cart->get_cart() as $cart_item_key => $cart_item ) {
     if ( $cart_item['product_id'] === $product_id ) {
      $in_cart = true;
      $key = $cart_item_key;
      break;
     }
 }
  if( WC()->cart->total > $cart_total ) {
    if ( $in_cart ) WC()->cart->remove_cart_item( $key );
  }
 }