WooCommerce结账页面:根据日期选择器生成配送时间选项数组求助
嘿,我来帮你搞定这个WooCommerce配送时间选项的需求!根据你说的规则,我整理了一段能动态生成符合要求选项的代码,完全适配当天和未来日期的不同逻辑,一起来看看👇
核心思路
- 先判断用户选择的配送日期是否为当天
- 当天的话,配送开始时间取当前时间+1小时,但不能早于11:00;未来日期直接从11:00开始
- 配送时段截止到16:00,所有选项按30分钟间隔生成
- 若当天当前时间+1小时已经超过16:00,返回“无可用时段”的提示
完整代码实现
function get_delivery_time_options($selected_date) { // 初始化配送时间选项数组 $time_options = array(); // 设置配送结束时间(固定16:00) $end_time = DateTime::createFromFormat('H:i', '16:00'); // 解析用户选择的日期,判断是否为当天 $today = new DateTime(); $selected_datetime = DateTime::createFromFormat('Y-m-d', $selected_date); $is_today = $selected_datetime->format('Y-m-d') === $today->format('Y-m-d'); if ($is_today) { // 当天逻辑:开始时间为当前时间+1小时 $start_time = clone $today; $start_time->modify('+1 hour'); // 兜底:如果当前时间+1小时早于11:00,就从11:00开始 $earliest_start = DateTime::createFromFormat('H:i', '11:00'); if ($start_time < $earliest_start) { $start_time = $earliest_start; } } else { // 未来日期逻辑:直接从11:00开始 $start_time = DateTime::createFromFormat('H:i', '11:00'); } // 处理当天无可用时段的情况 if ($start_time > $end_time) { $time_options[''] = __('No available delivery slots today', 'woocommerce'); return $time_options; } // 生成30分钟间隔的时间选项 $current_time = clone $start_time; while ($current_time <= $end_time) { $time_str = $current_time->format('H:i'); $time_options[$time_str] = $time_str; $current_time->modify('+30 minutes'); } return $time_options; } // 示例调用:假设用户选择的日期是今天 // $selected_date = date('Y-m-d'); // $delivery_time_options = get_delivery_time_options($selected_date);
代码关键点说明
$selected_date参数:需要从你的日期选择器字段中获取,格式为Y-m-d(比如2024-05-20)- 时间兜底逻辑:避免出现“当前时间+1小时早于11:00”的不合理时段
- 无时段处理:如果当天已经过了15:00(当前时间+1小时超过16:00),自动提示无可用配送时段
- 格式适配:生成的数组可以直接用于WooCommerce的自定义下拉字段中
在WooCommerce中使用的小提示
如果要在结账页面动态加载配送时间选项,你可以结合AJAX实现:当用户选择日期后,前端发送请求到后端调用get_delivery_time_options函数,再把返回的选项渲染到下拉框里,这样体验更流畅。
内容的提问来源于stack exchange,提问作者omukiguy




