使用 Dokan 插件时按供应商对 WooCommerce 购物车项目进行排序

问题描述

我们正在研究一种解决方案,可按供应商商店名称对购物车中的产品进行排序并结帐。我们在这里找到了这个:Woocommerce sort cart products by product category 但我们必须为我们的案例扩展这个代码。每个产品都有一个供应商。因此,我们不必检查产品是否没有供应商。

我不确定如何以正确的方式输出数组。我可以这样做吗?

add_action( 'woocommerce_cart_loaded_from_session',function() {

    global $woocommerce;
    
    // Build product array
    $products_in_cart = array();

    // Loop through cart items
    foreach ( $woocommerce->cart->cart_contents as $key => $item ) {
        
         // Get product object
        $product = $item->get_product();
        
        // Author id
        $author_id = $product->post->post_author;
        
        // Shopname
        $vendor = dokan()->vendor->get( $author_id );
        $shop_name = $vendor->get_shop_name();
        
        $products_in_cart[ $key ] = $shop_name[0]->name;
    
    }

    ksort( $products_in_cart );
    
    // Build cart array
    $cart_contents = array();
        
    foreach ( $products_in_cart as $cart_key => $vendor_store ) {
        $cart_contents[ $cart_key ] = $woocommerce->cart->cart_contents[ $cart_key ];
    }
    
    // Output sorted cart
    $woocommerce->cart->cart_contents = $cart_contents;

},100 );

解决方法

更新:尝试以下简化和重新访问的代码:

add_action( 'woocommerce_cart_loaded_from_session','sort_cart_items_by_vendor',100 );;
function sort_cart_items_by_vendor() {
    $items_to_sort = $cart_contents = array(); // Initializing

    // Loop through cart items
    foreach ( WC()->cart->cart_contents as $item_key => $cart_item ) {
        $vendor_id  = get_post_field( 'post_author',$cart_item['product_id']);
        $store_info = dokan_get_store_info( $vendor_id );
        $items_to_sort[ $item_key ] = $store_info['store_name'];
    }

    ksort( $items_to_sort );
    
    // Loop through sorted items key
    foreach ( $items_to_sort as $cart_item_key => $store_name ) {
        $cart_contents[ $cart_item_key ] = WC()->cart->cart_contents[ $cart_item_key ];
    }
    
    // Set sorted items as cart contents
    WC()->cart->cart_contents = $cart_contents;
}

代码位于活动子主题(或活动主题)的functions.php 文件中。它应该可以工作。

相关: