WooCommerce钩子函数间全局变量$unique_code无法访问求助
解决WooCommerce钩子中全局变量无法访问的问题
我来帮你排查这个问题——你遇到的核心问题是第二个钩子函数里没有声明要访问这个全局变量,导致PHP无法识别它。另外,全局变量在多订单处理或异步场景下可能会有意外问题,我给你两种解决方案:
方案1:修复全局变量的作用域问题
在第二个钩子函数开头,添加global $unique_code;声明,明确告诉PHP你要访问这个全局变量:
add_action( 'woocommerce_email_before_order_table', 'laksh_add_content_specific_email', 20, 4 ); function laksh_add_content_specific_email( $order, $sent_to_admin, $plain_text, $email ) { global $unique_code; $unique_code = mt_rand(100000, 999999); } add_action( 'woocommerce_email_after_order_table', 'laksh_add_content_specific_email2', 20, 4 ); function laksh_add_content_specific_email2( $order, $sent_to_admin, $plain_text, $email ) { // 必须添加这行声明,才能访问全局变量 global $unique_code; if ( $email->id == 'customer_processing_order' ) { echo '<h2 class="email-upsell-title">Redeem Code</h2>'; echo '<p class="email-upsell-p"><strong>' . $unique_code . '</strong></p>'; echo '<p class="email-upsell-p">Please show this code at the reception when you visit us to redeem your gift card.</p>'; } }
方案2:使用订单元数据存储(更推荐)
全局变量存在潜在风险(比如同时处理多个订单时可能被覆盖),更可靠的方式是把唯一码存储到订单的自定义元数据中,这样每个订单的代码都是独立的,还能在后台查看:
add_action( 'woocommerce_email_before_order_table', 'laksh_add_content_specific_email', 20, 4 ); function laksh_add_content_specific_email( $order, $sent_to_admin, $plain_text, $email ) { // 只给客户处理订单邮件生成并存储码 if ( $email->id == 'customer_processing_order' ) { $unique_code = mt_rand(100000, 999999); // 把码存储到订单元数据,键名可以自定义 $order->update_meta_data( '_customer_redeem_code', $unique_code ); $order->save(); } } add_action( 'woocommerce_email_after_order_table', 'laksh_add_content_specific_email2', 20, 4 ); function laksh_add_content_specific_email2( $order, $sent_to_admin, $plain_text, $email ) { if ( $email->id == 'customer_processing_order' ) { // 从订单元数据中获取码 $unique_code = $order->get_meta( '_customer_redeem_code' ); echo '<h2 class="email-upsell-title">Redeem Code</h2>'; echo '<p class="email-upsell-p"><strong>' . $unique_code . '</strong></p>'; echo '<p class="email-upsell-p">Please show this code at the reception when you visit us to redeem your gift card.</p>'; } }
这个方案的优势:
- 每个订单的兑换码独立存储,不会被其他订单干扰
- 可以在WooCommerce订单编辑页面查看这个兑换码(如果需要,还可以添加显示到后台的代码)
- 即使邮件重新发送,也能正确获取到原来的兑换码,而不是重新生成
内容的提问来源于stack exchange,提问作者Grey-lover
相关产品推荐
相关产品推荐

