在 WooCommerce 中最后对特定产品类别的购物车项目进行排序

Posted

技术标签:

【中文标题】在 WooCommerce 中最后对特定产品类别的购物车项目进行排序【英文标题】:Sort specific product category cart items at the end in WooCommerce 【发布时间】:2021-04-24 07:14:53 【问题描述】:

如何将定义的产品类别中的商品排序到购物车订单的末尾,例如,我希望属于产品类别“瓶子”的所有产品都位于购物车订单的末尾。

我找到了这个按价格排序的代码,但想按照上面的描述进行调整。

add_action( 'woocommerce_cart_loaded_from_session', 'prefix_cart_order_prod_cat' );

function prefix_cart_order_prod_cat() 

    $products_in_cart = array();
    // Assign each product's price to its cart item key (to be used again later)
    foreach ( WC()->cart->cart_contents as $key => $item ) 
        $product = wc_get_product( $item['product_id'] );
        $products_in_cart[ $key ] = $product->get_price();
    

    // SORTING - use one or the other two following lines:
    //asort( $products_in_cart ); // sort low to high
   arsort( $products_in_cart ); // sort high to low

    // Put sorted items back in cart
    $cart_contents = array();
    foreach ( $products_in_cart as $cart_key => $price ) 
       $cart_contents[ $cart_key ] = WC()->cart->cart_contents[ $cart_key ];
    

    WC()->cart->cart_contents = $cart_contents;


【问题讨论】:

【参考方案1】:

您可以使用has_term() conditional WordPress function 来检查购物车商品是否属于某个产品类别(但需要为相关产品(项目)设置定义的类别)

所以下面的代码将在最后对购物车中的物品进行排序:

add_action( 'woocommerce_cart_loaded_from_session', 'product_category_cart_items_sorted_end' );
function product_category_cart_items_sorted_end() 
    $category_terms    = __('T-shirts'); // Here set your category terms (can be names, slugs or Ids)
    $items_in_category = $other_items = array(); // Initizlizing

    // Assign each item in a different array depending if it belongs to defined category terms or not
    foreach ( WC()->cart->cart_contents as $key => $item ) 
        if( has_term( $category_terms, 'product_cat', $item['product_id'] ) ) 
            $items_in_category[ $key ] = $item;
         else 
            $other_items[ $key ] = $item;
        
    

    // Set back merged items arrays with the items that belongs to a category at the end
    WC()->cart->cart_contents = array_merge( $other_items, $items_in_category );

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

【讨论】:

以上是关于在 WooCommerce 中最后对特定产品类别的购物车项目进行排序的主要内容,如果未能解决你的问题,请参考以下文章

删除 Woocommerce 中特定产品类别的添加购物车按钮

在 WooCommerce 购物车中隐藏特定产品类别的缩略图

显示特定产品类别的术语或产品属性(woocommerce)

特定产品类别的强制性优惠券,避免在 Woocommerce 中结帐

隐藏产品价格并禁用 Woocommerce 中特定产品类别的添加到购物车

如果订单包含来自特定产品类别的商品,则为 WooCommerce 订单号添加前缀