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

WooCommerce Bookings预订记录按开始时间过滤问题求助

WooCommerce Bookings 特定时间段预订过滤解决方案

核心问题分析

  • get_bookings_for_selected_date返回的数组索引[4]存着正确的UTC格式开始时间,说明数据本身无误,问题出在后续取值和时间处理逻辑上。
  • $booking['booking_date']为空,因为WooCommerce Bookings的预订对象并非普通数组,不能直接用数组键名取值;$booking->start返回本地时间,是因为该属性默认会转换为站点时区,而非保留原始UTC时间。

具体解决方法

方法一:直接利用数组索引提取时间并处理

既然已确认数组索引[4]的时间格式正确,直接提取后转换为时间戳即可用于比较:

// 获取指定日期的预订数组
$bookings = get_bookings_for_selected_date($selected_date);

// 定义目标时间段(UTC时区,示例为13:00-15:00)
$target_start = strtotime($selected_date . ' 13:00 UTC');
$target_end = strtotime($selected_date . ' 15:00 UTC');

foreach ($bookings as $booking_data) {
    // 从数组索引[4]提取预订开始时间
    $booking_start_str = $booking_data[4];
    $booking_start_timestamp = strtotime($booking_start_str);
    
    // 判断是否在目标时间段内
    if ($booking_start_timestamp >= $target_start && $booking_start_timestamp < $target_end) {
        // 处理符合条件的预订数据,示例:获取预订ID并调取完整预订对象
        $booking_id = $booking_data[0];
        $booking = get_wc_booking($booking_id);
        // 后续可获取用户信息、订单关联数据等操作
    }
}

方法二:使用WooCommerce Bookings官方API获取正确时间

避免依赖数组索引(防止插件更新导致索引变动),调用官方方法获取原始UTC时间:

$bookings = get_bookings_for_selected_date($selected_date);

$target_start = strtotime($selected_date . ' 13:00 UTC');
$target_end = strtotime($selected_date . ' 15:00 UTC');

foreach ($bookings as $booking_data) {
    $booking_id = $booking_data[0];
    $booking = get_wc_booking($booking_id);
    
    // 获取原始UTC格式的开始时间字符串
    $booking_start_utc = $booking->get_start(null, 'UTC');
    $booking_start_timestamp = strtotime($booking_start_utc);
    
    if ($booking_start_timestamp >= $target_start && $booking_start_timestamp < $target_end) {
        // 处理符合条件的预订
    }
}

get_start(null, 'UTC')中第一个参数传null表示不转换为站点时区,第二个参数指定输出UTC时间,能直接拿到和数组索引[4]一致的原始时间。

方法三:结合ACF字段补充时间存储(备选方案)

如果上述方法仍有问题,可通过ACF给预订CPT添加UTC格式的开始时间字段,在预订创建时自动同步:

// 预订创建时同步UTC时间到ACF字段
add_action('woocommerce_booking_created', 'sync_booking_utc_time_to_acf', 10, 1);
function sync_booking_utc_time_to_acf($booking) {
    $utc_start = $booking->get_start(null, 'UTC');
    update_field('field_your_acf_key', $utc_start, $booking->get_id());
}

后续过滤时直接读取ACF字段:

$booking_start_utc = get_field('field_your_acf_key', $booking_id);
$booking_start_timestamp = strtotime($booking_start_utc);

注意事项

  • 所有时间比较必须统一时区(建议全程使用UTC),避免时区转换带来的误差。
  • 测试时可通过echo $booking_start_utc输出时间,确认格式和时区是否正确。

内容的提问来源于stack exchange,提问作者Wade Taylor

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 21:18:27