如何通过Hook修改WooCommerce后台订单标题及添加自定义字段?
解决WooCommerce后台订单号下方添加自定义字段/修改订单标题的Hook方案
我来帮你搞定这个问题!你之前尝试的两个Hook没生效,大概率是Hook的用法或者位置理解有偏差,下面给你几个靠谱的服务器端Hook实现方案,比jQuery的前端方案更稳定规范:
一、在订单号下方添加自定义字段(正确Hook用法)
woocommerce_admin_order_data_after_order_number这个Hook确实是用来在订单号之后输出内容的,可能你之前的函数写法有问题,试试这个完整的代码:
add_action( 'woocommerce_admin_order_data_after_order_number', 'add_custom_content_after_order_number', 10, 1 ); function add_custom_content_after_order_number( $order ) { // 示例1:输出订单的自定义字段值 $custom_meta = get_post_meta( $order->get_id(), 'your_custom_meta_key', true ); if ( ! empty( $custom_meta ) ) { echo '<div class="order_data_column"> <p><strong>' . __( '客户专属编号:', 'woocommerce' ) . '</strong> ' . esc_html( $custom_meta ) . '</p> </div>'; } // 示例2:直接添加自定义标题或文本 echo '<div class="order_data_column"> <h4 style="margin: 10px 0;">' . __( '订单备注:', 'woocommerce' ) . '</h4> <p>' . esc_html( $order->get_customer_note() ) . '</p> </div>'; }
代码说明:
- 把
your_custom_meta_key换成你实际的自定义字段键名 - 用
$order对象可以直接调用WooCommerce的订单方法,比如$order->get_customer_note()获取客户备注、$order->get_billing_email()获取邮箱等 - 用
esc_html()确保输出内容安全,避免XSS风险 - 包裹在
order_data_column类里可以和后台的布局保持一致
二、修改订单标题(替换原订单号显示)
如果你的需求是修改订单号本身的显示(比如改成自定义格式),可以用woocommerce_admin_order_number过滤器:
add_filter( 'woocommerce_admin_order_number', 'customize_admin_order_title', 10, 2 ); function customize_admin_order_title( $original_order_number, $order ) { // 自定义订单号格式,比如加上前缀+自定义字段 $custom_order_title = 'VIP-ORD-' . $order->get_id(); // 如果你想保留原订单号并追加内容 // $custom_order_title = $original_order_number . ' | 客户ID:' . $order->get_customer_id(); return $custom_order_title; }
三、之前Hook没生效的常见原因
- 代码放置位置错误:要把代码放到当前主题的
functions.php文件里,或者自己创建的自定义插件中,不要直接放到WooCommerce核心文件(会被更新覆盖) - 函数名冲突:确保你的函数名是唯一的,不要和其他插件/主题的函数重名
- 优先级问题:如果其他插件也用了同一个Hook,试试把优先级调高(比如改成20),确保你的代码最后执行
为什么Hook方案比jQuery更好?
- 服务器端渲染,不会有页面加载后才显示内容的延迟问题
- 更符合WooCommerce的开发规范,后台UI更新时不容易失效
- 不需要依赖前端JS,兼容性更好(比如禁用JS的场景也能正常显示)
内容的提问来源于stack exchange,提问作者webmastx
相关产品推荐
相关产品推荐

