为兼容HPOS的WooCommerce后台订单列表添加订单总重量
解决WooCommerce HPOS下订单总重量列失效问题
你的代码失效核心原因是HPOS(高性能订单存储)启用后,后台订单页面的钩子和订单对象获取方式发生了变化:
- 原钩子
manage_shop_order_posts_custom_column仅适用于传统post类型的订单,HPOS页面需要使用专属钩子 - 全局
$the_order对象在HPOS环境下不再有效,需通过订单ID获取订单实例
以下是修正后的完整代码,可直接替换原有片段:
// 添加订单总重量列 add_filter( 'manage_woocommerce_page_wc-orders_columns', 'add_order_weight_column' ); function add_order_weight_column( $columns ) { $columns['total_weight'] = __( 'Weight', 'woocommerce' ); return $columns; } // 填充重量列内容(适配HPOS) add_action( 'manage_woocommerce_page_wc-orders_custom_column', 'populate_order_weight_column_content', 10, 2 ); function populate_order_weight_column_content( $column, $order_id ) { if ( $column == 'total_weight' ) { // 通过订单ID获取HPOS订单对象 $order = wc_get_order( $order_id ); // 优先读取已保存的_cart_weight元数据 $total_weight = $order->get_meta( '_cart_weight' ); // 若元数据不存在,实时计算订单总重量 if ( empty( $total_weight ) ) { $total_weight = 0; foreach ( $order->get_items() as $item ) { $product = $item->get_product(); if ( $product && $product->has_weight() ) { $total_weight += $product->get_weight() * $item->get_quantity(); } } // 可选:保存计算结果到元数据,避免重复计算 $order->update_meta_data( '_cart_weight', $total_weight ); $order->save(); } // 格式化显示重量或N/A echo $total_weight > 0 ? wc_format_weight( $total_weight ) : __( 'N/A', 'woocommerce' ); } }
关键修改说明:
- 钩子替换:用
manage_woocommerce_page_wc-orders_custom_column替代原钩子,这是HPOS后台订单页面的专属自定义列钩子,支持传递$column和$order_id两个参数 - 订单对象获取:通过
wc_get_order( $order_id )获取HPOS兼容的订单实例,放弃全局$the_order - 重量兜底计算:增加了元数据不存在时的实时计算逻辑,确保即使之前未保存重量数据,也能正常显示结果
- 可选优化:将计算后的重量保存到元数据,减少后续页面加载时的重复计算开销
使用方式:将代码添加到主题的functions.php文件或自定义插件中,启用HPOS后即可在后台订单页面看到正常显示的总重量列。
内容的提问来源于stack exchange,提问作者Merlin
相关产品推荐
相关产品推荐

