添加带日期屏蔽的配送日期字段后,订单后台及邮件未同步数据求助
问题排查与修复方案
你的代码存在两个核心问题,导致日期信息无法同步到订单后台及通知邮件:
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
相关产品推荐
相关产品推荐

