WooCommerce:检查商品是不是已在购物车中

Posted

技术标签:

【中文标题】WooCommerce:检查商品是不是已在购物车中【英文标题】:WooCommerce: Check if items are already in cartWooCommerce:检查商品是否已在购物车中 【发布时间】:2017-05-06 20:33:00 【问题描述】:

我从website找到了这个很棒的sn-p

以下是检查购物车中是否存在特定产品的功能:

        function woo_in_cart($product_id) 
        global $woocommerce;         
        foreach($woocommerce->cart->get_cart() as $key => $val ) 
            $_product = $val['data'];

            if($product_id == $_product->id ) 
                return true;
            
                 
        return false;
        

这可以在任何需要的地方使用:

      if(woo_in_cart(123)) 
     // Product is already in cart
     

问题是如何使用它来检查多个这样的产品:

      if(woo_in_cart(123,124,125,126...)) 
     // Product is already in cart
     

谢谢。

source

【问题讨论】:

你必须多次调用该函数或重写它。 你可以检查所有产品 if(woo_in_cart(123)) // 产品已经在购物车中 我需要这种方式来检查多个产品: if(woo_in_cart(123,124,125,126...)) // 产品已经在购物车中 @LoicTheAztec 伙计,只要我在电脑上,我就会运行你的代码。非常感谢您的帮助。 确保在您的全局 $woocommerce 之前添加if (is_admin()) return false;,以便此功能不会在后端运行。 【参考方案1】:

案例 1:将数组作为参数传递。

 function woo_in_cart($arr_product_id) 
        global $woocommerce;         
        $cartarray=array();

        foreach($woocommerce->cart->get_cart() as $key => $val ) 
            $_product = $val['data'];
            array_push($cartarray,$_product->id);
                 
        $result = !empty(array_intersect($cartarray,$arr_product_id));
        return $result;

        

如何调用函数

$is_incart=array(2,4,8,11);
print_r(woo_in_cart($is_incart));

案例 2:使用您运行的代码。

$is_in_product_cart=array(123,124,125,126,..);

foreach($is_in_product_cart as $is_in_cart ) 
    if(woo_in_cart($is_in_cart))
    
        // Product is already in cart
    

【讨论】:

"不能使用函数返回值" 错误在于:$result = !empty(array_intersect($cartarray,$arr_product_id)); 首先检查此操作:print_r(array_intersect($cartarray,$arr_product_id)); 我无法检查任何功能使网站崩溃 在托管服务器上是的【参考方案2】:

global $woocommerce$woocommerce->cart过时,只是被WC()->cart替换

这是一个自定义函数,其参数接受唯一的整数产品 ID 或产品 ID 数组,并将返回购物车中匹配的 Id 数量。

代码处理任何产品类型,包括可变产品和产品变体:

function matched_cart_items( $search_products ) 
    $count = 0; // Initializing

    if ( ! WC()->cart->is_empty() ) 
        // Loop though cart items
        foreach(WC()->cart->get_cart() as $cart_item ) 
            // Handling also variable products and their products variations
            $cart_item_ids = array($cart_item['product_id'], $cart_item['variation_id']);

            // Handle a simple product Id (int or string) or an array of product Ids 
            if( ( is_array($search_products) && array_intersect($search_products, cart_item_ids) ) 
            || ( !is_array($search_products) && in_array($search_products, $cart_item_ids)
                $count++; // incrementing items count
        
    
    return $count; // returning matched items count 

此代码位于您的活动子主题(活动主题或任何插件文件)的 function.php 文件中。

代码已经过测试并且可以工作。


用法:

1) 对于唯一的产品 ID(整数):

$product_id = 102;

// Usage as a condition in an if statement
if( 0 < matched_cart_items($product_id) )
    echo '<p>There is "'. matched_cart_items($product_id) .'"matched items in cart</p><br>';
 else 
    echo '<p>NO matched items in cart</p><br>';

2) 对于产品 ID 数组:

$product_ids = array(102,107,118);

// Usage as a condition in an if statement
if( 0 < matched_cart_items($product_ids) )
    echo '<p>There is "'. matched_cart_items($product_ids) .'"matched items in cart</p><br>';
 else 
    echo '<p>NO matched items in cart</p><br>';

3) 对于 3 个或更多匹配的购物车项目的产品 ID 数组,例如:

$product_ids = array(102, 107, 118, 124, 137);

// Usage as a condition in an if statement (for 3 matched items or more)
if( 3 <= matched_cart_items($product_ids) )
    echo '<p>There is "'. matched_cart_items($product_ids) .'"matched items in cart</p><br>';
 else 
    echo '<p>NO matched items in cart</p><br>';

【讨论】:

抱歉回复晚了,它对我不起作用。 $product_ids = 数组(7657,7995,8000,7999,7998,7997,7996); if( 0 @mysticalghoul 好的,让我在我的测试服务器上检查并重新测试它,这应该很快解决(这个脚本的想法就在那里)......如果你喜欢我们可以在 Skype 上聊天(我的 ID 是marsloic) 因为这里的聊天太史前了…… 's' 在用法 #1 中的变量名称 $product_id 中缺失,除此之外,完美! @Gangesh 我已经改变了……谢谢。【参考方案3】:

woo_in_cart 函数中存在错误。 这是正确的:

 function woo_in_cart($arr_product_id) 
    global $woocommerce;
    $cartarray=array();

    foreach($woocommerce->cart->get_cart() as $key => $val ) 
       $_product = $val['product_id'];
       array_push($cartarray,$_product);
    

    if (!empty($cartarray)) 
       $result = array_intersect($cartarray,$arr_product_id);
    

    if (!empty($result)) 
       return true;
     else 
       return false;
    ;


这里是一个用法示例:

//Set IDs Array variable

$my_products_ids_array = array(22,23,465);
if (woo_in_cart($my_products_ids_array)) 
  echo 'ohh yeah there some of that products in!';
else 
  echo 'no matching products :(';

【讨论】:

【参考方案4】:

也许更简单一些,首先我们在购物车中获取产品 ID:

$product_ids = array_merge(
  wp_list_pluck(WC()->cart->get_cart_contents(), 'variation_id'),
  wp_list_pluck(WC()->cart->get_cart_contents(), 'product_id')
);

现在,如果您想检查一种产品,只需使用in_array 函数:

in_array(123, $product_ids);

对于不止一种产品:

array_intersect([123, 345, 567], $product_ids);

【讨论】:

不错的短版!

以上是关于WooCommerce:检查商品是不是已在购物车中的主要内容,如果未能解决你的问题,请参考以下文章

将购物车商品数据发送到 PayPal WooCommerce

如何在 Woocommerce 购物车小部件中显示商品的总价?

在 WooCommerce 购物车中显示所有交叉销售商品

在 WooCommerce 中将购物车商品限制为来自同一产品类别

在 Woocommerce 购物车页面中的购物车商品名称后添加产品 ID

php WOOCOMMERCE在购物车中重新加载商品数量