实现WooCommerce购物车、迷你购物车及订单按SKU排序
解决方案
你的原代码仅针对产品目录页面(商店页、分类页等)生效,因为woocommerce_get_catalog_ordering_args钩子只作用于产品目录的查询参数。要让迷你购物车、购物车、结账页及感谢页的商品按SKU排序,需要针对购物车和订单分别处理:
1. 排序购物车商品(含迷你购物车)
使用woocommerce_cart_contents钩子对购物车中的商品数组进行排序:
add_filter( 'woocommerce_cart_contents', 'sort_cart_items_by_sku' ); function sort_cart_items_by_sku( $cart_items ) { // 按SKU升序排序购物车商品 usort( $cart_items, function( $item_a, $item_b ) { $sku_a = $item_a['data']->get_sku(); $sku_b = $item_b['data']->get_sku(); return strcmp( $sku_a, $sku_b ); } ); return $cart_items; }
2. 排序订单商品(结账页、感谢页)
使用woocommerce_order_get_items钩子对订单中的商品进行排序,同时保留运费、优惠券等非商品类项目的位置:
add_filter( 'woocommerce_order_get_items', 'sort_order_items_by_sku', 10, 2 ); function sort_order_items_by_sku( $order_items, $order ) { // 筛选出订单中的商品类项目(排除运费、优惠券等) $line_items = array_filter( $order_items, function( $item ) { return $item->get_type() === 'line_item'; } ); // 按SKU升序排序商品 usort( $line_items, function( $item_a, $item_b ) { $sku_a = $item_a->get_product()->get_sku(); $sku_b = $item_b->get_product()->get_sku(); return strcmp( $sku_a, $sku_b ); } ); // 合并排序后的商品与其他类型项目 $non_line_items = array_diff_key( $order_items, $line_items ); return array_merge( $line_items, $non_line_items ); }
使用说明
将上述代码添加到你的WordPress主题的functions.php文件中,或者自定义插件的代码文件里即可生效。两个函数分别覆盖了:
- 迷你购物车、购物车页面的商品排序
- 结账页订单预览、感谢页订单详情的商品排序
内容的提问来源于stack exchange,提问作者Christophe
相关产品推荐
相关产品推荐

