如何在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
相关产品推荐
相关产品推荐

