如何修正WooCommerce配送类显示顺序,使其按指定价格排序?
解决WooCommerce配送类显示顺序不符合预期的问题
手动添加配送类的顺序不会决定前端显示顺序,WooCommerce默认按配送类ID或名称排序。要实现你期望的$80、$90、$200、$300升序显示,有两种可靠方法:
方法一:插件可视化排序
- 安装WooCommerce Shipping Classes Order类配送类排序插件
- 激活后进入WooCommerce → 设置 → 配送 → 配送类页面
- 直接拖拽配送类到目标顺序,保存后前端将按该顺序显示,操作简单无需代码。
方法二:代码自定义排序(适合不想用插件的场景)
方式1:指定固定顺序
将以下代码添加到主题functions.php文件,或使用代码片段插件(如Code Snippets)添加:
add_filter( 'woocommerce_shipping_classes', 'custom_sort_shipping_classes' ); function custom_sort_shipping_classes( $classes ) { // 替换为你实际的配送类slug,按期望顺序排列 $desired_order = array( 'shipping-80', 'shipping-90', 'shipping-200', 'shipping-300' ); $sorted_classes = array(); foreach ( $desired_order as $slug ) { foreach ( $classes as $class ) { if ( $class->slug === $slug ) { $sorted_classes[] = $class; break; } } } return $sorted_classes; }
- 配送类slug可在对应配送类的编辑页面查看,替换为你自己的slug即可。
方式2:按名称中的价格自动排序
如果配送类名称包含价格(如“标准配送 $80”),可通过代码自动提取价格并排序,无需手动指定slug:
add_filter( 'woocommerce_shipping_classes', 'sort_shipping_classes_by_price_in_name' ); function sort_shipping_classes_by_price_in_name( $classes ) { usort( $classes, function( $a, $b ) { // 从名称中提取数字价格 preg_match('/\$(\d+)/', $a->name, $matches_a); preg_match('/\$(\d+)/', $b->name, $matches_b); $price_a = isset($matches_a[1]) ? (int)$matches_a[1] : 0; $price_b = isset($matches_b[1]) ? (int)$matches_b[1] : 0; return $price_a - $price_b; // 升序排序,降序则改为$price_b - $price_a }); return $classes; }
内容的提问来源于stack exchange,提问作者kola popa
相关产品推荐
相关产品推荐

