WooCommerce订单元数据无法读取,自定义邮件文本添加失败求助
解决WooCommerce订单元数据无法在邮件中获取的问题
问题根源
- 钩子执行时机滞后:你使用的
woocommerce_thankyou钩子在用户进入订单感谢页面时才触发,而WooCommerce的邮件通知(比如new_order)可能在这之前就已发送,导致邮件触发时approval_required元数据还未写入订单。 - 元数据获取方式过时:新版WooCommerce中,直接调用
get_post_meta($order->id)的方式已不推荐,且$order->id属性已被废弃,应使用订单对象的get_meta()方法获取自定义元数据。
修正代码
// 替换钩子,在订单创建时写入元数据 add_action('woocommerce_checkout_update_order_meta', 'assign_approver_to_order'); function assign_approver_to_order($order_id){ $user_id = get_current_user_id(); $company_id = get_user_meta($user_id, 'parent', true); if($company_id){ // 用WooCommerce官方方法写入元数据,更规范 $order = wc_get_order($order_id); $order->update_meta_data('approval_required', 'yes'); $order->save(); } } // 修改邮件中的元数据获取逻辑 add_action( 'woocommerce_email_order_details', 'custom_text_in_customer_new_order_email', 999, 4 ); function custom_text_in_customer_new_order_email( $order, $sent_to_admin, $plain_text, $email ) { // 使用订单对象的get_meta方法获取元数据 $order_approval = $order->get_meta('approval_required'); if( $order_approval == "yes" ) { switch($email->id){ case "new_order": $custom_txt = "<b>This order is waiting for approval.</b><br>"; echo $custom_txt; break; case "customer_on_hold_order": $custom_txt = "<b>Your order is waiting for approval.</b><br>"; echo $custom_txt; break; } } }
关键说明
- 钩子替换:
woocommerce_checkout_update_order_meta在订单完成结账流程、数据写入数据库时触发,时机早于邮件发送,确保元数据在邮件触发前已存在。 - 元数据操作:使用
$order->update_meta_data()和$order->get_meta()是WooCommerce官方推荐的方式,能自动兼容不同版本的存储逻辑,避免直接操作数据库的潜在问题。
内容的提问来源于stack exchange,提问作者B Khan
相关产品推荐
相关产品推荐

