Woocommerce wp datepicker 计算提货和交货日期

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

我需要 wp 日期选择器的帮助。我想要的是 - 结账页面的客户可以选择取货和送货日期。选择日期后,然后在购物车摘要中显示计算结果 - 例如,我选择 24.07 - 26.07,然后在计算中显示 2 天并乘以产品价格 x2。我会添加我需要的屏幕截图。

现在我有这个(functions.php)-

// Add custom checkout datepicker fields
add_action( 'woocommerce_before_order_notes', 'datepicker_custom_fields' );
function datepicker_custom_fields( $checkout ) {
    $pickup_datepicker_slug = 'pickup_datepicker';
    $delivery_datepicker_slug = 'delivery_datepicker';
 
    echo '<div id="datepicker-wrapper">';
 
    woocommerce_form_field( $pickup_datepicker_slug, array(
        'type' => 'text',
        'class'=> array( 'form-row-first my-datepicker'),
        'label' => __('Pickup date'),
        'required' => true,
    ), '' );
 
    woocommerce_form_field( $delivery_datepicker_slug, array(
        'type' => 'text',
        'class'=> array( 'form-row-first my-datepicker'),
        'label' => __('Delivery date'),
        'required' => true,
    ), '' );
 
    echo '<br clear="all"></div>';
 
    // Jquery: Enable the Datepicker
    ?>
    <script language="javascript">
    jQuery( function($){
        var pickup = '#<?php echo $pickup_datepicker_slug ?>';
        var delivery = '#<?php echo $delivery_datepicker_slug ?>';
        $(pickup).datepicker({
            dateFormat: 'dd.mm.yy', // ISO formatting date
        });
        $(delivery).datepicker({
            dateFormat: 'dd.mm.yy', // ISO formatting date
        });
    });
    </script>
    <?php
}
 
// Display additional information after order total in checkout
add_action( 'woocommerce_review_order_after_order_total', 'display_additional_info_after_total' );
function display_additional_info_after_total() {
    // Get the pickup and delivery dates from the POST request (checkout page)
    $pickup_date = isset( $_POST['pickup_datepicker'] ) ? sanitize_text_field( $_POST['pickup_datepicker'] ) : '';
    $delivery_date = isset( $_POST['delivery_datepicker'] ) ? sanitize_text_field( $_POST['delivery_datepicker'] ) : '';
 
    // Calculate the difference in days between pickup and delivery dates
    $pickup_timestamp = strtotime( $pickup_date );
    $delivery_timestamp = strtotime( $delivery_date );
    $days_difference = ceil( ( $delivery_timestamp - $pickup_timestamp ) / ( 60 * 60 * 24 ) );
 
    // Calculate the fee based on the cart subtotal and days difference
    $cart = WC()->cart;
    $fee = $cart->subtotal * $days_difference; // Modify this formula if needed
 
    // Display the additional information
    if ( $days_difference > 0 ) {
        echo '<p>Total ' . wc_price( $cart->subtotal + $fee ) . ' ( ' . wc_price( $fee ) . ' x ' . $days_difference . ' dienas )</p>';
    }
}

php post woocommerce jquery-ui-datepicker
1个回答
0
投票

我不确定你正在使用哪个主题,但你可以做这样的事情。

在日期选择器

onSelect
事件上,您可以通过这个名为
update_checkout
 的 woocommerce 触发 
woocommerce_before_calculate_totals

// Add custom checkout datepicker fields
function datepicker_custom_fields( $checkout ) {
    $pickup_datepicker_slug = 'pickup_datepicker';
    $delivery_datepicker_slug = 'delivery_datepicker';

    echo '<div id="datepicker-wrapper">';
 
    woocommerce_form_field( $pickup_datepicker_slug, array(
        'type' => 'text',
        'class'=> array( 'form-row-first my-datepicker'),
        'label' => __('Pickup date'),
        'required' => true,
    ), WC()->session->get( 'pickup_datepicker' ) );
 
    woocommerce_form_field( $delivery_datepicker_slug, array(
        'type' => 'text',
        'class'=> array( 'form-row-first my-datepicker'),
        'label' => __('Delivery date'),
        'required' => true,
    ), WC()->session->get( 'delivery_datepicker' ) );
 
    echo '<br clear="all"></div>';

    ?>
    <script type="text/javascript">
        jQuery(document).ready(function($) {

            var pickup = '#pickup_datepicker';
            var delivery = '#delivery_datepicker';
            $(pickup).datepicker({
                dateFormat: 'dd.mm.yy', // ISO formatting date
                onSelect: function(selected) {
                    var selectedDate = selected.split('.').reverse().join('-'); // Convert to 'yy-mm-dd' format
                    var minDate = new Date(selectedDate);
                    minDate.setDate(minDate.getDate() + 1);
                    $(delivery).datepicker("option", "minDate", minDate);
                    calculateDays();
                }
            });
            $(delivery).datepicker({
                dateFormat: 'dd.mm.yy', // ISO formatting date
                onSelect: function(selected) {
                    calculateDays();
                }
            });

            // Function to calculate the days between two dates
            function calculateDays() {
                $( document.body ).trigger( 'update_checkout' );
            }

        });
    </script>
    <?php

}
add_action( 'woocommerce_before_order_notes', 'datepicker_custom_fields' );

在此过滤器中,您可以捕获

pickup_datepicker
delivery_datepicker
值,并使用
DateTime
类和
diff
函数计算天数。并使用
set_price
功能设置购物车商品价格。

function override_cart_item_price( $cart ) {

    if ( is_admin() && ! defined( 'DOING_AJAX' ) ){
        return;
    }

    if ( did_action( 'woocommerce_before_calculate_totals' ) >= 2 ){
        return;
    }

    parse_str($_POST['post_data'], $post_data);

    if (isset($post_data['pickup_datepicker']) && $post_data['pickup_datepicker'] != '' && isset($post_data['delivery_datepicker']) && $post_data['delivery_datepicker'] != '') {

        WC()->session->set('pickup_datepicker', sanitize_text_field($post_data['pickup_datepicker']));
        WC()->session->set('delivery_datepicker', sanitize_text_field($post_data['delivery_datepicker']));

        $pickup_datepicker = sanitize_text_field($post_data['pickup_datepicker']);
        $delivery_datepicker = sanitize_text_field($post_data['delivery_datepicker']);

        $pickup_date_obj = new DateTime($pickup_datepicker);
        $delivery_date_obj = new DateTime($delivery_datepicker);

        $interval = $pickup_date_obj->diff($delivery_date_obj);
        $days = $interval->days;
        $days = ( $days > 1 ) ? $days : 1 ;
        
        WC()->session->set('delivery_days', $days );

        foreach ( $cart->get_cart() as $cart_item_key => $cart_item ) {
            // Calculate the new subtotal and total based on the number of days
            $new_price = $cart_item['data']->get_price() * $days;
            $cart_item['data']->set_price( $new_price );    
            $cart_item['days'] = $days;
        }
    }
    
}
add_action( 'woocommerce_before_calculate_totals', 'override_cart_item_price', 99, 1 );

通过使用此过滤器,您可以在价格旁边显示天数。

function add_days_woocommerce_cart_item_subtotal( $total, $cart_item, $cart_item_key ){
    $delivery_days = WC()->session->get( 'delivery_days' );
    if( $delivery_days ){
        $day_label = 'day';
        $product  = wc_get_product( $cart_item['product_id'] );
        if( $delivery_days > 1 ){
            $day_label = 'days';
        }
        $total = wc_price( $product->get_price() ) . ' x '. $delivery_days. '('.$day_label.')' . ' = '. $total;
    }
    return $total;
}

add_filter( 'woocommerce_cart_item_subtotal', 'add_days_woocommerce_cart_item_subtotal', 10, 3 );

参考资料:

已测试并工作。

更新根据OP的评论。

您可以将

plugins/woocommerce/templates/checkout/review-order.php
覆盖到您的主题
yourthemename/woocommerce/checkout/review-order.php

参考

您将在下面的代码中找到它。并根据您的要求进行更改。

<tr class="order-total">
    <th><?php esc_html_e( 'Total', 'woocommerce' ); ?></th>
    <td><?php wc_cart_totals_order_total_html(); ?></td>
</tr>
© www.soinside.com 2019 - 2024. All rights reserved.