基于Woocommerce结帐中选定日期的动态选择字段选项

时间:2018-04-15 18:11:39

标签: php jquery woocommerce jquery-ui-datepicker checkout

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

  1. jQuery-ui Datepicker字段,
  2. 时间的选择字段(下拉列表)。
  3. 现在,我希望时间选择字段下拉选项取决于所选日期。基本上如果选择星期六和星期日,我希望时间间隔有限(仅限于15:00)。

    我尝试了很多不同的策略,但似乎没有一种是正确的方法。

    以下是两个自定义字段:

    //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>';
    }
    

    感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

以下代码将根据结帐页面中jQuery-ui Datepicker字段中所选日期通过jQuery动态加载时间选择字段选项。

我还为select字段(selectWoo库的克隆)启用了select2

我已将您的函数和单独的脚本合并到专用钩子中。

您重新访问的代码:

// 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文件中。经过测试和工作

enter image description here