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

求助:如何在WooCommerce订单及邮件通知中正确显示自定义结账字段的值

求助:如何在WooCommerce订单及邮件通知中正确显示自定义结账字段的值

看起来你已经有了一个不错的开头,能针对特定商品(ID6270)在结账页面添加配送伙伴选择字段,但代码好像没写完,而且还缺少把字段值保存到订单、显示在后台订单页和邮件里的关键步骤。我帮你把完整的功能补全,确保整个流程都能顺畅运行:

完整的实现需要覆盖这几个核心环节:

  • 在结账页面针对目标商品显示自定义字段
  • 验证字段的必填性,防止用户跳过选择
  • 把用户选择的字段值保存到订单数据中
  • 在后台订单详情页展示这个字段值
  • 在订单邮件通知里包含该字段信息

下面是补全后的完整代码:

// 1. 在结账页面针对特定商品显示自定义字段
add_action( 'woocommerce_after_checkout_billing_form', 'my_custom_checkout_field', 10, 1 );
function my_custom_checkout_field( $checkout ) {
    
    $targeted_product_id = 6270; // 指定目标商品ID
    $has_targeted_product = false;

    // 检查购物车是否包含目标商品(包括商品变体)
    foreach( WC()->cart->get_cart() as $item ){
        if ( in_array($targeted_product_id, [$item['product_id'], $item['variation_id']]) ) {
            $has_targeted_product = true;
            break;
        }
    }

    // 如果购物车没有目标商品,直接退出不显示字段
    if ( !$has_targeted_product ) {
        return;
    }

    echo '<div id="my_custom_checkout_field">
    <h2>' . __('Please select your Delivery Partner') . '</h2>';

    woocommerce_form_field( 'delivery_partner', array(
        'type'          => 'select',
        'required'      => true,
        'label'         => __('Delivery Partner'),
        'options'       => array(
            ''                  => __('---Please select your Delivery Partner---'),
            'partner_a'         => __('Delivery Partner A'),
            'partner_b'         => __('Delivery Partner B'),
            'partner_c'         => __('Delivery Partner C')
        ),
    ), $checkout->get_value( 'delivery_partner' ) );

    echo '</div>';
}

// 2. 验证自定义字段是否填写完整
add_action( 'woocommerce_checkout_process', 'my_custom_checkout_field_validation' );
function my_custom_checkout_field_validation() {
    $targeted_product_id = 6270;
    $has_targeted_product = false;

    foreach( WC()->cart->get_cart() as $item ){
        if ( in_array($targeted_product_id, [$item['product_id'], $item['variation_id']]) ) {
            $has_targeted_product = true;
            break;
        }
    }

    // 如果购物车有目标商品但用户没选配送伙伴,抛出错误提示
    if ( $has_targeted_product && empty( $_POST['delivery_partner'] ) ) {
        wc_add_notice( __( 'Please select your Delivery Partner.' ), 'error' );
    }
}

// 3. 把自定义字段值保存到订单元数据中
add_action( 'woocommerce_checkout_update_order_meta', 'my_custom_checkout_field_update_order_meta' );
function my_custom_checkout_field_update_order_meta( $order_id ) {
    if ( ! empty( $_POST['delivery_partner'] ) ) {
        update_post_meta( $order_id, 'delivery_partner', sanitize_text_field( $_POST['delivery_partner'] ) );
    }
}

// 4. 在后台订单详情页显示自定义字段值
add_action( 'woocommerce_admin_order_data_after_billing_address', 'my_custom_checkout_field_display_admin_order_meta', 10, 1 );
function my_custom_checkout_field_display_admin_order_meta( $order ) {
    $delivery_partner = get_post_meta( $order->get_id(), 'delivery_partner', true );
    if ( !empty($delivery_partner) ) {
        echo '<p><strong>' . __('Delivery Partner') . ':</strong> ' . esc_html( $delivery_partner ) . '</p>';
    }
}

// 5. 在订单邮件通知中添加自定义字段信息
add_action( 'woocommerce_email_after_order_table', 'my_custom_checkout_field_display_email', 20, 4 );
function my_custom_checkout_field_display_email( $order, $sent_to_admin, $plain_text, $email ) {
    $delivery_partner = get_post_meta( $order->get_id(), 'delivery_partner', true );
    if ( !empty($delivery_partner) ) {
        if ( $plain_text ) {
            echo "\n" . __('Delivery Partner') . ': ' . esc_html( $delivery_partner ) . "\n";
        } else {
            echo '<p><strong>' . __('Delivery Partner') . ':</strong> ' . esc_html( $delivery_partner ) . '</p>';
        }
    }
}

我还给你调整了几个细节:

  • 修正了购物车检查逻辑:原来的代码如果购物车有其他商品就直接退出,现在改成只有当购物车包含目标商品时才显示字段,逻辑更合理
  • 补全了字段必填验证,避免用户跳过选择直接结账
  • 优化了字段选项结构,默认选项设为空值,配合必填验证逻辑
  • 增加了邮件适配,支持纯文本和HTML两种邮件格式的显示

你只需要把这段代码添加到主题的functions.php文件里,或者用自定义代码插件来添加,就能实现完整的功能了。

备注:内容来源于stack exchange,提问作者user22722114

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.17 08:23:07