如何修改代码使WooCommerce订单项按字母排序并设置例外项位置
修改WooCommerce订单项排序:固定指定行项位置
当然可以修改代码实现这个需求。我们可以通过调整排序逻辑,把PO#、Terms、Discount这类文书行项固定在最前面,或者挪到最后,其余订单项保持原有的字母排序。
方案1:将指定文书行项固定在最前
把需要前置的项放进$priority_items数组,排序时优先让这些项排在前面,剩下的项按名称自然排序:
add_filter( 'woocommerce_order_get_items', function( $items, $order ) { // 定义需要固定在最前的行项名称 $priority_items = array('PO#', 'Terms', 'Discount'); uasort( $items, function( $a, $b ) use ( $priority_items ) { $a_is_priority = in_array( $a['name'], $priority_items ); $b_is_priority = in_array( $b['name'], $priority_items ); // 如果a是优先项,b不是,a排前面 if ( $a_is_priority && !$b_is_priority ) { return -1; } // 如果b是优先项,a不是,b排前面 elseif ( !$a_is_priority && $b_is_priority ) { return 1; } // 都不是优先项,按名称自然排序 else { return strnatcmp( $a['name'], $b['name'] ); } }); return $items; }, 10, 2 );
方案2:将指定文书行项固定在最后
如果需要把这些项放到末尾,只需要调整排序判断的返回值即可:
add_filter( 'woocommerce_order_get_items', function( $items, $order ) { // 定义需要固定在最后的行项名称 $priority_items = array('PO#', 'Terms', 'Discount'); uasort( $items, function( $a, $b ) use ( $priority_items ) { $a_is_priority = in_array( $a['name'], $priority_items ); $b_is_priority = in_array( $b['name'], $priority_items ); // 如果a是末尾项,b不是,b排前面 if ( $a_is_priority && !$b_is_priority ) { return 1; } // 如果b是末尾项,a不是,a排前面 elseif ( !$a_is_priority && $b_is_priority ) { return -1; } // 都不是末尾项,按名称自然排序 else { return strnatcmp( $a['name'], $b['name'] ); } }); return $items; }, 10, 2 );
注意事项
- 你可以根据实际需求修改
$priority_items数组里的内容,添加或移除需要固定位置的行项名称,注意名称要和订单项的实际名称完全匹配。 - 代码里用的
strnatcmp是自然排序,会保留原有的字母排序逻辑,比普通字符串排序更符合日常阅读习惯。
内容的提问来源于stack exchange,提问作者AlexTSF
相关产品推荐
相关产品推荐

