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

添加带日期屏蔽的配送日期字段后,订单后台及邮件未同步数据求助

问题排查与修复方案

你的代码存在两个核心问题,导致日期信息无法同步到订单后台及通知邮件:

1. 保存字段时的POST键名不匹配

你创建的字段slug是my_datepicker,但保存函数里错误使用了datepicker_custom_field作为POST键名,导致无法获取用户选择的日期值。

2. 缺少日期展示的相关代码

即便字段值保存成功,也需要额外代码将日期展示在订单后台、用户订单页及通知邮件中。

完整修复后的代码

// Register main datepicker jQuery plugin script
add_action( 'wp_enqueue_scripts', 'enabling_date_picker' );
function enabling_date_picker() {
    // Only on front-end and checkout page
    if( is_admin() || ! is_checkout() ) return;

    // Load the datepicker jQuery-ui plugin script
    wp_enqueue_script( 'jquery-ui-datepicker' );
    wp_enqueue_style('jquery-ui', "http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/themes/smoothness/jquery-ui.css", '', '', false);
}

// Add custom checkout datepicker field
add_action( 'woocommerce_checkout_shipping', 'datepicker_custom_field' );
function datepicker_custom_field($checkout) {
    $datepicker_slug = 'my_datepicker';

    echo '<div id="datepicker-wrapper">';

    woocommerce_form_field($datepicker_slug, array(
        'type' => 'text',
        'class'=> array( 'form-row-first my-datepicker'),
        'label' => __('Fecha de entrega'),
        'required' => true, // Or false
    ), '' );

    echo '<br clear="all"></div>';


    // Jquery: Enable the Datepicker
    ?>
    <script language="javascript">
    jQuery( function($){
        var dates = ['2024-11-01', '2024-11-02', '2024-11-03'];
        var a = '#<?php echo $datepicker_slug ?>';
        $(a).datepicker({
            beforeShowDay: function(date)
            {
                var string = jQuery.datepicker.formatDate('yy-mm-dd', date);
                return [dates.indexOf(string) == -1];
            }
        });
    });
    </script>
    <?php
}

// Save custom fields data
add_action('woocommerce_checkout_update_order_meta', 'rfds_save_custom_checkout_fields');
function rfds_save_custom_checkout_fields($order_id) {
    // 修正POST键名,与字段slug保持一致
    if (!empty($_POST['my_datepicker'])) {
        update_post_meta($order_id, '_delivery_date', sanitize_text_field($_POST['my_datepicker']));
    }
}

// 在订单管理后台显示配送日期
add_action( 'woocommerce_admin_order_data_after_shipping_address', 'display_delivery_date_in_admin_order' );
function display_delivery_date_in_admin_order($order) {
    $delivery_date = get_post_meta( $order->get_id(), '_delivery_date', true );
    if ( $delivery_date ) {
        echo '<p><strong>' . __('Fecha de entrega') . ':</strong> ' . esc_html( $delivery_date ) . '</p>';
    }
}

// 在用户订单详情页显示配送日期
add_action( 'woocommerce_order_details_after_order_table', 'display_delivery_date_in_customer_order' );
function display_delivery_date_in_customer_order($order) {
    $delivery_date = get_post_meta( $order->get_id(), '_delivery_date', true );
    if ( $delivery_date ) {
        echo '<p><strong>' . __('Fecha de entrega') . ':</strong> ' . esc_html( $delivery_date ) . '</p>';
    }
}

// 在订单通知邮件中添加配送日期
add_action( 'woocommerce_email_after_order_table', 'add_delivery_date_to_order_emails', 10, 4 );
function add_delivery_date_to_order_emails( $order, $sent_to_admin, $plain_text, $email ) {
    $delivery_date = get_post_meta( $order->get_id(), '_delivery_date', true );
    if ( $delivery_date ) {
        if ( $plain_text ) {
            echo "\n" . __('Fecha de entrega') . ': ' . esc_html( $delivery_date ) . "\n";
        } else {
            echo '<p><strong>' . __('Fecha de entrega') . ':</strong> ' . esc_html( $delivery_date ) . '</p>';
        }
    }
}

修复说明

  • 修正保存函数的POST键名,确保能正确获取用户选择的日期值
  • 新增三个展示函数:
    • display_delivery_date_in_admin_order:在后台订单的配送地址区域显示日期
    • display_delivery_date_in_customer_order:在用户端订单详情页显示日期
    • add_delivery_date_to_order_emails:在所有订单通知邮件(含用户及管理员邮件)中添加日期信息
  • 将元数据键名改为_delivery_date,更具语义化,避免与其他字段冲突

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 19:03:20