如何在WooCommerce后台订单详情页显示含税总价并解决退款订单报错
错误原因分析
原代码触发致命错误主要是两个场景适配问题:
- 未对订单项类型做校验:订单详情页的订单项列表除了商品项外,还包含退款项、运费项、手续费项等,这类非商品项不具备常规商品订单项的属性和方法,调用时会抛出错误
- 未做订单对象有效性判断:部分异常场景下通过订单项获取关联订单对象可能返回空值,后续调用订单相关方法时会触发报错
修复后代码
function action_woocommerce_admin_order_item_values( $null, $item ) { // 仅处理商品类型的订单项,排除退款、运费等其他类型项 if ( ! $item instanceof WC_Order_Item_Product ) { return; } $order = $item->get_order(); // 校验订单对象是否有效,无效直接返回 if ( ! $order instanceof WC_Order ) { return; } // 如果需要退款状态的订单完全不显示该列,可以打开下面两行注释 // if ( $order->has_status( 'refunded' ) ) { // return; // } $val = floatval($item->get_total()) + floatval($item->get_total_tax()); ?> <td class="item_full_cost" data-sort-value="<?= $val ?>"> <div class="view" style="font-weight: bold; text-align: right; padding-right: 10px;"> <?= wc_price($val, ['currency' => $order->get_currency()]) ?> </div> <?php $refunded = $order->get_total_refunded_for_item( $item->get_id() ); if ( $refunded ) { echo '<small class="refunded">-' . wc_price( $refunded, array( 'currency' => $order->get_currency() ) ) . '</small>'; } ?> </td> <?php }; add_action( 'woocommerce_admin_order_item_values', 'action_woocommerce_admin_order_item_values', 10, 2 ); function action_woocommerce_admin_order_item_headers( $order ) { // 如果需要退款状态的订单完全不显示该列,可以打开下面两行注释 // if ( $order->has_status( 'refunded' ) ) { // return; // } echo '<th class="line_full_cost sortable" data-sort="float" style="font-weight:bold;text-align: right;">' . __('Price incl. VAT') .'</th>'; }; add_action( 'woocommerce_admin_order_item_headers', 'action_woocommerce_admin_order_item_headers', 10, 1 );
修复说明
- 移除了原代码中对
$item的强制类型声明,避免非商品订单项传入时直接抛出类型错误 - 新增订单项类型校验,仅对商品类订单项输出含税金额列
- 新增订单对象有效性校验,避免空对象调用方法时的致命错误
- 预留了退款订单隐藏整列的判断逻辑,按需开启注释即可使用
- 修正了表头钩子的参数接收数量,原代码声明接收3个参数但实际仅传入1个,避免PHP警告
内容的提问来源于stack exchange,提问作者Corentin-CPCI
相关产品推荐
相关产品推荐

