仅当存在现有预订时才为 WooCommerce 可预订产品添加缓冲期

问题描述 投票:0回答:1

我正在使用 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);
        }
    }
}
php woocommerce product setter woocommerce-bookings
1个回答
0
投票

您的代码中有多个错误:

  • is_product()
    是一个条件函数(但不是方法)。不需要它,因为您使用的 WooCommerce 挂钩已经针对单个产品页面。
  • 不应在函数内使用函数。
  • WC_Product_Booking
    set_buffer_period()
    方法仅接受一个参数
  • 在产品上使用setter方法时,需要使用
    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 文件中(或插件中)。它可以工作。

© www.soinside.com 2019 - 2024. All rights reserved.