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

