You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在woocommerce_email_order_details钩子中获取ACF订单字段为空如何解决

问题解决:WooCommerce订单邮件中ACF字段booking_reference取值为空

核心原因

  • WooCommerce默认触发woocommerce_email_order_details钩子、发送订单通知邮件的时机,早于你在functions.php中写的结账后保存booking_reference字段的逻辑执行时机,这时候字段还没写入数据库,所以读取为空
  • ACF的get_field()函数依赖ACF初始化的上下文,部分邮件发送场景下上下文缺失也会导致读取失败

解决方案

方案1:调整保存字段逻辑的钩子优先级

把结账时保存booking_reference的逻辑绑定到更早触发的WooCommerce结账钩子,并且设置比邮件发送钩子更高的优先级(数值越小优先级越高),比如绑定到woocommerce_checkout_update_order_meta钩子,优先级设为5:

add_action('woocommerce_checkout_update_order_meta', 'save_custom_booking_reference', 5, 2);
function save_custom_booking_reference($order_id, $data) {
    // 此处替换为你的预订参考号生成逻辑
    $booking_reference = '自定义生成的参考号';
    update_field('booking_reference', $booking_reference, $order_id);
}

方案2:用原生WordPress函数读取字段,避免ACF上下文依赖

如果调整优先级后还是有问题,直接用get_post_meta()读取数据库原生存储的自定义字段值,不需要依赖ACF的上下文:

// 替换你原来的get_field代码即可
$order_id = $order->get_id();
$reference_number_acf_order = get_post_meta($order_id, 'booking_reference', true);

方案3:调整邮件输出逻辑的钩子优先级

如果仍然存在时序问题,可以把你在邮件中输出字段的逻辑绑定到更低优先级的参数,确保是在字段保存后执行:

add_action('woocommerce_email_order_details', 'add_booking_reference_to_email', 20, 4);
function add_booking_reference_to_email($order, $sent_to_admin, $plain_text, $email) {
    $reference_number_acf_order = get_post_meta($order->get_id(), 'booking_reference', true);
    if($reference_number_acf_order) {
        echo '<p><strong>预订参考号:</strong>' . esc_html($reference_number_acf_order) . '</p>';
    }
}

内容的提问来源于stack exchange,提问作者Fabian Milu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.10 17:36:03