我正在使用 WooCommerce Bookings,如果我使用管理 UI 向产品添加缓冲区,即使当天该产品没有预订,它也会添加缓冲区。这限制了人们可以选择的时间,这不好,因为我已经设置了产品,以便客户可以选择从一小时开始的六小时时段。使用管理 UI,它会创建一个缓冲区,这样您就只能在上午 7 点、上午 9 点、上午 11 点预订产品(如果缓冲区设置为 2 小时),而无法在上午 7 点、上午 8 点、上午 9 点等预订产品等等
我想做的是当(且仅当)有预订时为产品添加缓冲区。
假设某产品在 6 月 2 日上午 8 点至中午 12 点有预订。我希望有人能够预订它,但我希望在现有预订结束后有 2 小时的缓冲时间。因此,如果有人尝试预订 6 月 2 日的房间,他们会在下午 2 点开始看到空房情况。但是,如果当天没有该产品的预订,我不希望缓冲区影响可用的开始时间。
下面的代码可以很好地获取某人正在查看的产品的产品 ID,并且我可以很好地获取预订(
$bookings
返回有效信息),但是过滤器会默默地失败。它不会改变缓冲区(或者至少如果改变了,也不会反映在 UI 中的“开始时间”下拉列表中),因此我的示例中的第一个可用开始时间是中午 12 点,即根本没有任何缓冲区。 “wc_bookings_get_time_slots”似乎不是我需要的东西,但我似乎找不到是什么......
add_action('woocommerce_before_single_product', 'custom_set_buffer_period_for_viewed_product');
function custom_set_buffer_period_for_viewed_product() {
// Ensure WooCommerce functions are available
if (function_exists('is_product') && is_product()) {
global $product;
$product_id = $product->get_id();
error_log("Product ID $product_id");
$buffer_before = 0;
$buffer_after = 120;
if ($product_id) {
// Check if there are existing bookings for the product
$bookings = WC_Bookings_Controller::get_bookings_for_objects(array($product_id));
error_log(print_r($bookings,true));
add_filter('wc_bookings_get_time_slots', function($booking, $booking_id) use ($buffer_before, $buffer_after) {
// Apply the buffer period if there are existing bookings
$booking->set_buffer_period($buffer_before, $buffer_after);
return $booking;
}, 10, 2);
}
}
}
您的代码中有多个错误:
is_product()
是一个条件函数(但不是方法)。不需要它,因为您使用的 WooCommerce 挂钩已经针对单个产品页面。WC_Product_Booking
set_buffer_period()
方法仅接受一个参数save()
方法才能生效。尝试以下(未经测试):
add_action('woocommerce_before_single_product', 'custom_set_buffer_period_for_viewed_product');
function custom_set_buffer_period_for_viewed_product() {
global $product;
// Targetting bookable products only
if ( is_a($product, 'WC_Product_Booking') ) {
// Check if there are existing bookings for the product
$bookings = WC_Bookings_Controller::get_all_existing_bookings( $product );
if ( count($bookings) > 0 ) {
## Increase the buffer after period
$product->set_buffer_period(120);
$product->save(); // Always save changes
} else {
## You may revert back the buffer after period if there are no bookings
// $product->set_buffer_period(0);
// $product->save();
}
}
}
代码位于子主题的functions.php 文件中(或插件中)。它可以工作。