基于 Woocommerce 结帐中 select 天的动态 select 字段选项

Dynamic select field options based on selected day in Woocommerce checkout

我在 Woocommerce 结账中添加了 2 个自定义字段:

  1. 一个jQuery-ui日期选择器字段,
  2. select 时间字段(下拉)。

现在,我希望时间 select 字段下拉选项取决于所选日期。基本上,如果选择星期六和星期日,我希望限制时间间隔(只到 15:00)。

我尝试了很多不同的策略,但其中 none 似乎是正确的方法。

这是两个自定义字段:

//Datepicker 
add_action( 'woocommerce_before_order_notes', 'my_custom_checkout_field_DP' );


function my_custom_checkout_field_DP($checkout)
{
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);
wp_enqueue_style('datepicker', plugins_url('/css/datepicker.css', __FILE__), '', '', false);

/*print(' <link rel="stylesheet" type="text/css" href="' . plugins_url() . '/order-delivery-date-for-woocommerce/datepicker.css">

<script type="text/javascript" src="' . plugins_url() . '/order-delivery-date-for-woocommerce/datepicker.js"></script>'
);
print('<script type="text/javascript" src="' . plugins_url() . '/order-delivery-date-for-woocommerce/initialize-datepicker.js"></script>');*/


echo '<script language="javascript">jQuery(document).ready
(function(){
jQuery("#e_deliverydate").width("150px");
var formats = ["MM d, yy","MM d, yy"];
jQuery("#e_deliverydate").val("").datepicker({dateFormat: formats[1], minDate:1});
jQuery("#e_deliverydate").parent().after("<div id=\'order-desc\'></div>");
});   </script>';

echo '<div id="my_custom_checkout_field_DP" style="width: 202%; float: left;">';

woocommerce_form_field('e_deliverydate', array(
'type' => 'text', 
'class'=> array('my-field-class form-row-first'),
'label' => __('Your Delivery Date'), 
'required' => true, 
'placeholder' => __('Pick a date')
), $checkout->get_value('e_deliverydate'));

 echo '</div>';

//Time selection field


add_action( 'woocommerce_before_order_notes', 'my_custom_checkout_field_TIME' ); 
unction my_custom_checkout_field_TIME( $checkout ) {

woocommerce_form_field( 'my_custom_field_TIME', array(
'type'          => 'select',
'class'         => array('my-field-class form-row-wide'),
'label'         => __('Your time'),
'required'      => true, 
'placeholder'   => __('Time to pick'),

'options'       => array(
'10:00'   => __( '10:00', 'wps' ),
'10:30'   => __( '10:30', 'wps' ),
'11:00'   => __( '11:00', 'wps' ),
'11:30'   => __( '11:30', 'wps' ),
'12:00'   => __( '12:00', 'wps' ),
'12:30'   => __( '12:30', 'wps' ),
'13:00'   => __( '13:00', 'wps' ),
'13:30'   => __( '13:30', 'wps' ),
'14:00'   => __( '14:00', 'wps' ),
'14:30'   => __( '14:30', 'wps' ),
'15:00'   => __( '15:00', 'wps' ),
'15:30'   => __( '15:30', 'wps' ),
'16:00'   => __( '16:00', 'wps' ),
'16:30'   => __( '16:30', 'wps' ),
'17:00'   => __( '17:00', 'wps' ),
'17:30'   => __( '17:30', 'wps' ),
'18:00'   => __( '18:00', 'wps' ),
)
), $checkout->get_value( 'my_custom_field_TIME' ));

echo '</div>';
}

感谢任何帮助。

下面的代码将根据 jQuery-ui 日期选择器字段中的 selected 日期,通过 jQuery 动态加载时间 select 字段选项在结帐页面。

我还为 select 字段启用了 selectWooselect2 库的克隆)。

我已经合并了你的函数和单独的脚本在一个专用的钩子中排队。

您重访的代码:

// 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);
    ## wp_enqueue_style('datepicker', plugins_url('/css/datepicker.css', __FILE__), '', '', false);
}

// Datepicker field and select time field
add_action( 'woocommerce_before_order_notes', 'datepicker_custom_field' );
function datepicker_custom_field($checkout) {

    // $globalText = get_post_meta( $order_parent_id, 'e_deliverydate', true);

    echo '<div id="date-time-wrapper">';

    woocommerce_form_field('delivery_date', array(
        'type' => 'text',
        'class'=> array('delivery-date-class form-row-first'),
        'label' => __('Your Delivery Date'),
        'required' => true,
        'placeholder' => __('Pick a date')
    ), $checkout->get_value('delivery_date') );

    $options = array('' => __('Time to pick…') );

    woocommerce_form_field( 'delivery_time', array(
        'type'          => 'select',
        'class'         => array('delivery-time-class form-row-last'),
        'label'         => __('Your Delivery time'),
        'required'      => true,
        'options'       => $options,
    ),  $checkout->get_value( 'delivery_time' ) );

    // Restricted options array
    $options1 = array(
        '10:00'   => __( '10:00', 'wps' ),
        '10:30'   => __( '10:30', 'wps' ),
        '11:00'   => __( '11:00', 'wps' ),
        '11:30'   => __( '11:30', 'wps' ),
        '12:00'   => __( '12:00', 'wps' ),
        '12:30'   => __( '12:30', 'wps' ),
        '13:00'   => __( '13:00', 'wps' ),
        '13:30'   => __( '13:30', 'wps' ),
        '14:00'   => __( '14:00', 'wps' ),
        '14:30'   => __( '14:30', 'wps' ),
        '15:00'   => __( '15:00', 'wps' ),
    );

    // The other part of options array
    $options2 = array(
        '15:30'   => __( '15:30', 'wps' ),
        '16:00'   => __( '16:00', 'wps' ),
        '16:30'   => __( '16:30', 'wps' ),
        '17:00'   => __( '17:00', 'wps' ),
        '17:30'   => __( '17:30', 'wps' ),
        '18:00'   => __( '18:00', 'wps' ),
    );

    // Merging options arrays 
    $options1 = array_merge($options, $options1); // Partial
    $options  = array_merge($options1,$options2); // Full

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

    ?>
    <script language="javascript">
    jQuery( function($){
        var a = <?php echo json_encode($options); ?>,
            b = <?php echo json_encode($options1); ?>,
            c = new Date(),
            s = 'select#delivery_time';

        // Utility function to fill dynamically the select field options
        function dynamicSelectOptions( opt ){
            var o = '';
            $.each( opt, function( key, value ){
                o += '<option value="'+key+'">'+value+'</option>';
            });
            $(s).html(o);
        }

        // Once DOM is loaded
        if( c.getDay() == 6 || c.getDay() == 0 )
            dynamicSelectOptions( b );
        else
            dynamicSelectOptions( a );

        // Select time to selectWoo
        $(s).selectWoo();

        // Datepicker
        $('#delivery_date').datepicker({
            dateFormat: 'MM d, yy',
            minDate:1,
            onSelect: function(){
                // Live event: On selected date event
                var d = new Date($(this).val());
                if( d.getDay() == 6 || d.getDay() == 0 )
                    dynamicSelectOptions( b );
                else
                    dynamicSelectOptions( a );
            }
        }).parent().after('<div id="order-desc"></div>');
    });
    </script>
    <?php
}

代码进入您的活动子主题(或活动主题)的 function.php 文件。已测试并有效