如何在WooCommerce「我的账户」订单表格中显示商品SKU
解决方案:修改WooCommerce订单总计列显示商品SKU
我明白你的需求——因为店铺限制一次只能购买一种商品,你想把订单总计列的“X for Y items”改成“X for Y [SKU]”。你之前用的ngettext过滤器确实能修改文本,但它最大的问题是拿不到订单的SKU数据,因为这个过滤器只负责字符串翻译,不传递订单上下文。
下面给你一个可行的解决方案,用WooCommerce专属钩子实现,既能修改文本,又能获取到商品SKU:
add_action('woocommerce_my_account_my_orders_column_order-total', 'custom_order_total_column_with_sku', 10, 1); function custom_order_total_column_with_sku($order) { // 获取订单中的所有商品(因限制一次只买一种,直接取第一个即可) $items = $order->get_items(); $item = reset($items); // 获取商品SKU,兼容商品已删除的情况 $product = $item->get_product(); $sku = $product ? $product->get_sku() : ''; // 获取订单格式化后的总计金额和商品数量 $total = $order->get_formatted_order_total(); $item_count = $order->get_item_count(); // 构建最终显示文本 $display_text = sprintf('%1$s for %2$s %3$s', $total, $item_count, $sku); // 输出修改后的内容 echo $display_text; }
代码说明:
- 钩子选择:
woocommerce_my_account_my_orders_column_order-total是专门用于修改“我的账户”页面订单总计列的钩子,会直接传递$order对象,让我们能获取订单的所有数据。 - SKU获取逻辑:因为你限制一次只买一种商品,所以用
reset($items)直接取第一个商品;同时做了兼容处理,如果商品已被删除,会显示空字符串避免报错。 - 文本格式化:用
sprintf拼接内容,保留了WooCommerce原生的金额格式化样式,完美替换“items”为对应SKU。
为什么原来的代码行不通?
你之前用的ngettext是WordPress的通用翻译钩子,它只接收翻译文本、原文本和域名三个参数,完全没有订单上下文,根本无法获取到SKU这类订单专属数据。必须使用能访问订单对象的WooCommerce钩子才能实现需求。
内容的提问来源于stack exchange,提问作者Emmanuel Kuebu
相关产品推荐
相关产品推荐

