添加日期运送字段,可以选择阻止某些日期并将信息添加到管理部分和电子邮件

问题描述 投票:0回答:1

我使用以下代码添加发货日期字段,并能够阻止某些日期。这通常工作正常,但是,该信息不会添加到订单和电子邮件的管理部分。

谁能帮我理解缺少哪一部分?

// 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) {
    if (!empty($_POST['datepicker_custom_field'])) {
        update_post_meta($order_id, '_datepicker_custom_field', sanitize_text_field($_POST['datepicker_custom_field']));
    }
}
woocommerce
1个回答
1
投票

首先,主要错误是您需要使用“my_datepicker”字段名称参数。

现在,您可能不再使用

woocommerce_checkout_update_order_meta
旧挂钩,它与高性能订单存储(HPOS)并不真正兼容。相反,您可以使用:

  • woocommerce_checkout_create_order
    (有
    $order
    $data
    参数)
    ,
  • woocommerce_checkout_order_created
    (有
    $order
    参数)

所以尝试以下方法:

add_action( 'woocommerce_checkout_create_order', 'save_custom_checkout_date_picker_value', 20, 2 );
function save_custom_checkout_date_picker_value( $order, $data ) {
    $datepicker_slug = 'my_datepicker';

    if (isset($_POST[$datepicker_slug]) && !empty($_POST[$datepicker_slug]) ) {
        $order->add_meta_data( 'delivery_date', sanitize_text_field($_POST[$datepicker_slug], true ) );
    }
}

现在您可以使用以下方法从 WC_Order 对象检索并显示交货日期:

if ( $delivery_date = $order->get_meta('delivery_date') ){
    echo '<p>' . $delivery_date . '</p>';
}

请参阅 在 WooCommerce 订单详细信息中保存自定义结帐交货时间字段值答案,以在管理订单、客户订单和电子邮件通知中显示交货日期。

© www.soinside.com 2019 - 2024. All rights reserved.