【问题标题】:Add or remove specific cart Item based on WooCommerce cart total根据 WooCommerce 购物车总数添加或删除特定购物车项目
【发布时间】:2021-04-08 22:58:05
【问题描述】:

如果订单总额高于 199.99 美元,我正在尝试将免费产品添加到购物车

我已经实现了这一点,它正在发挥作用。问题是,如果用户随后从购物车中删除了一个商品并再次低于 199.99 美元(以防止游戏系统),我需要删除该产品。

我所拥有的似乎正在工作。问题是我似乎需要在 REMOVE FROM CART 操作似乎起作用(或刷新页面)之前单击 2 个链接。

这是什么原因造成的?是否可以通过 AJAX 完成删除操作?

// -------------------------------------------
// ADD PRODUCT IF ORDER MINIMUM ABOVE 200

/*
* Automatically adding the product to the cart when cart total amount reach to $199.99.
*/

function aapc_add_product_to_cart() {
    global $woocommerce;

    $cart_total = 199.99;   

    if ( $woocommerce->cart->total >= $cart_total ) {
        if ( is_user_logged_in() ) {
            $free_product_id = 339;  // Product Id of the free product which will get added to cart
            $found      = false;

            //check if product already in cart
            if ( sizeof( WC()->cart->get_cart() ) > 0 ) {
                foreach ( WC()->cart->get_cart() as $cart_item_key => $values ) {
                    $_product = $values['data'];
                    if ( $_product->get_id() == $free_product_id )
                        $found = true;                  
                }
                // if product not found, add it
                if ( ! $found )
                    WC()->cart->add_to_cart( $free_product_id );
            } else {
                // if no products in cart, add it
                WC()->cart->add_to_cart( $free_product_id );
            }        
        }
    }
    if ( $woocommerce->cart->total <= $cart_total && $found ) {
                WC()->cart->remove_cart_item( $free_product_id );
            }       
}

add_action( 'template_redirect', 'aapc_add_product_to_cart' );

add_action( 'template_redirect', 'remove_product_from_cart_programmatically' );

function remove_product_from_cart_programmatically() {
    if ( is_admin() ) return;
    $product_id = 339; // product id
    $cart_total = 199.99;
    $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 );
    }
}

【问题讨论】:

  • 请同时包含您的 html 和 javascript 代码
  • HTML 是标准的 wordpress/woocommerce 内容。这是通过 Functions.php 执行的,没有使用 javascript。纯 PHP。
  • 那么恐怕你需要使用 Ajax 进行动态更新
  • @RonnieMcDonte 您只需要使用与购物车相关的挂钩,该挂钩由 AJAX 驱动,如下面的答案所示,对您的代码进行一些更改。

标签: php wordpress woocommerce product cart


【解决方案1】:

您不应该使用template_redirect 钩子根据购物车总阈值添加或删除免费产品……此外,您的代码有点过时并存在一些错误。

改为使用启用 Ajax 的 woocommerce_before_calculate_totals 钩子,这样:

add_action( 'woocommerce_before_calculate_totals', 'add_or_remove_cart_items', 10, 1 );
function add_or_remove_cart_items( $cart ) {
    if ( is_admin() && ! defined( 'DOING_AJAX' ) )
        return;

    // ONLY for logged users (and avoiding the hook repetition) 
    if ( ! is_user_logged_in() && did_action( 'woocommerce_before_calculate_totals' ) >= 2 )
        return;

    $threshold_amount = 200; // The threshold amount for cart total
    $free_product_id  = 339; // ID of the free product
    $cart_items_total = 0; // Initializing

    // Loop through cart items
    foreach ( $cart->get_cart() as $cart_item_key => $cart_item ){
        // Check if the free product is in cart
        if ( $cart_item['data']->get_id() == $free_product_id ) {
            $free_item_key = $cart_item_key;
        }
        // Get cart subtotal incl. tax from items (with discounts if any)
        $cart_items_total += $cart_item['line_total'] + $cart_item['line_tax'];
    }

    // If Cart total is up to the defined amount and if the free products is not in cart, we add it.
    if ( $cart_items_total >= $threshold_amount && ! isset($free_item_key) ) {
        $cart->add_to_cart( $free_product_id );
    }
    // If cart total is below the defined amount and free product is in cart, we remove it.
    elseif ( $cart_items_total < $threshold_amount && isset($free_item_key) ) {
        $cart->remove_cart_item( $free_item_key );
    }
}

代码在您的活动子主题(或活动主题)的functions.php 文件中。经过测试并且可以工作。

相关:Other similar answer threads

【讨论】:

  • 编辑:它确实有效。我没有意识到只有在查看购物车/结帐页面时才能看到该产品。这实际上是可取的。非常感谢。我不知道有启用 AJAX 的钩子。这将有助于解决未来的很多问题。谢谢谢谢!
猜你喜欢
  • 2018-07-23
  • 2023-03-09
  • 2019-09-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多