You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动