You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在WooCommerce Bookings中实现选择日期自动提前三周创建预订

实现WooCommerce Bookings自定义日期逻辑

嘿,针对你提出的WooCommerce Bookings需求,我整理了一套可行的代码方案,分模块帮你实现自动调整预订日期+限制可选日期范围的功能:

1. 自动将用户选择的日期转换为三周前的起始日期

我们可以通过钩子拦截用户提交的日期数据,自动计算并替换为所选日期的21天前作为预订起始日,同时固定预订时长为35天(5周)。

add_filter( 'woocommerce_bookings_get_posted_data', 'adjust_booking_start_date_to_three_weeks_before', 10, 2 );
function adjust_booking_start_date_to_three_weeks_before( $posted_data, $product ) {
    // 仅对预订类型产品生效
    if ( ! $product->is_type( 'booking' ) ) {
        return $posted_data;
    }

    // 检查用户是否提交了日期
    if ( isset( $posted_data['_booking_date'] ) && ! empty( $posted_data['_booking_date'] ) ) {
        $selected_date = DateTime::createFromFormat( 'Y-m-d', $posted_data['_booking_date'] );
        
        if ( $selected_date ) {
            // 计算三周前的日期作为预订起始日
            $start_date = $selected_date->modify( '-21 days' );
            $posted_data['_booking_date'] = $start_date->format( 'Y-m-d' );
            
            // 固定预订时长为35天(5周)
            $posted_data['_booking_duration'] = 35;
            $posted_data['_booking_duration_unit'] = 'day';
        }
    }

    return $posted_data;
}

2. 限制用户可选的日期范围

为了确保用户选择的日期符合规则,我们从后端验证+前端交互两方面入手:

后端验证(防止恶意提交)

用钩子验证用户提交的日期,确保对应的预订时段(前三周到后两周)合理:

add_action( 'woocommerce_booking_form_submit_validation', 'validate_selected_booking_date_range', 10, 3 );
function validate_selected_booking_date_range( $passed, $product, $_POST ) {
    if ( ! $product->is_type( 'booking' ) ) {
        return $passed;
    }

    if ( isset( $_POST['_booking_date'] ) && ! empty( $_POST['_booking_date'] ) ) {
        $selected_date = DateTime::createFromFormat( 'Y-m-d', $_POST['_booking_date'] );
        if ( ! $selected_date ) {
            wc_add_notice( '请选择有效的日期。', 'error' );
            return false;
        }

        // 计算预订时段的起始和结束日期
        $booking_start = clone $selected_date;
        $booking_start->modify( '-21 days' );
        $booking_end = clone $selected_date;
        $booking_end->modify( '+14 days' );

        // 示例:确保预订起始日不早于当前日期(可根据需求调整)
        $today = new DateTime();
        $today->setTime( 0, 0, 0 );
        
        if ( $booking_start < $today ) {
            wc_add_notice( '所选日期不符合预订规则,请选择一个足够晚的日期,确保预订起始日期不早于今天。', 'error' );
            return false;
        }
    }

    return $passed;
}

前端日期选择器限制(提升用户体验)

通过自定义JS直接禁用无效日期,让用户无法选择不符合规则的日期:

add_action( 'wp_footer', 'restrict_booking_date_picker_range' );
function restrict_booking_date_picker_range() {
    // 仅在预订产品页面加载
    global $product;
    if ( ! is_product() || ! $product->is_type( 'booking' ) ) {
        return;
    }
    ?>
    <script>
        jQuery(document).ready(function($) {
            // 等待日期选择器初始化完成
            setTimeout(function() {
                $('.wc-bookings-date-picker').datepicker('option', {
                    beforeShowDay: function(date) {
                        var selectedDate = new Date(date);
                        var bookingStart = new Date(selectedDate);
                        bookingStart.setDate(selectedDate.getDate() - 21);
                        var today = new Date();
                        today.setHours(0, 0, 0, 0);

                        // 仅允许预订起始日不早于今天的日期
                        var isValid = bookingStart >= today;
                        return [isValid, '', isValid ? '' : '该日期不符合预订规则'];
                    }
                });
            }, 1000);
        });
    </script>
    <?php
}

使用提示

  • 把上述代码添加到主题的functions.php文件,或者用Code Snippets这类自定义代码插件来管理。
  • 可以根据你的业务需求调整验证规则,比如是否允许起始日在过去、是否添加其他日期限制等。
  • 测试前请确保WooCommerce Bookings插件已激活,且预订产品设置为「按天预订」模式。

内容的提问来源于stack exchange,提问作者Thorned Rose

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 10:31:48