WooCommerce订单邮件按SKU排序商品失败,寻求技术支持
解决WooCommerce订单邮件商品按SKU排序的问题
嘿,我看你尝试给WooCommerce订单邮件里的商品按SKU排序,但之前的代码没生效,我来帮你搞定这个问题~
原代码的问题所在
你之前的代码里直接用$a['_sku']来获取SKU是不对的——WooCommerce返回的订单商品项$items里的每个元素都是WC_Order_Item_Product对象,不是数组,所以没法直接用数组下标访问属性。
修正后的代码
直接用这段代码替换你原来的,就能实现按SKU自然排序的需求:
add_filter( 'woocommerce_order_get_items', function( $items, $order ) { // 仅在订单邮件场景生效,避免影响后台/前端的订单商品展示顺序 if ( ! is_wc_endpoint_url() && did_action('woocommerce_email_before_order_table') ) { uasort( $items, function( $a, $b ) { // 获取商品对象,再提取SKU;处理商品已删除的情况,默认空字符串 $sku_a = $a->get_product() ? $a->get_product()->get_sku() : ''; $sku_b = $b->get_product() ? $b->get_product()->get_sku() : ''; // 自然排序,符合你给出的示例顺序逻辑 return strnatcmp( $sku_a, $sku_b ); } ); } return $items; }, 10, 2 );
关键说明
- 对象属性访问:通过
$a->get_product()拿到对应的商品对象,再用get_sku()方法获取SKU,这是WooCommerce官方推荐的正确方式 - 场景限制:加了条件判断,只在订单邮件生成时触发排序,不会打乱后台订单编辑页、用户前端订单详情页的商品原始顺序
- 容错处理:考虑了商品可能被删除的情况,给不存在的商品设置空SKU,避免代码报错
你可以下个测试订单,看看收到的邮件里商品是不是按照你想要的INFSTRAW → NFMUFFIN → INFFLORES → INFTAFLOR → INFTAPINK → CTEPINK4 → CTECAKE4 → INFCHOCO → UCUBTOMA顺序排列啦~
内容的提问来源于stack exchange,提问作者jpussacq
相关产品推荐
相关产品推荐

