从 WooCommerce Booking Google 未付款状态的日历同步中排除产品

Exclude a product from WooCommerce Booking Google calendar sync in unpaid status

我无法从 woocommerce 预订中排除 1 个产品 Google 处于未付款状态的日历同步。我有一个客户在他们付款的地方预订个人 类。这些 类 我需要在未付费状态下与我的 google 日历同步。 1 个产品供更多人使用,每个人都必须在课程开始前付款。我想在这些预订付款到我的日历后同步它们。

我使用此代码将未付款的预订添加到我的 google 日历中。

add_filter('woocommerce_booking_is_paid_statuses', 'woocommerce_booking_add_unpaid_to_is_paid_statuses');
function woocommerce_booking_add_unpaid_to_is_paid_statuses( $statuses ) { 
$statuses[]= 'unpaid';
return $statuses;
}

我需要从该函数中排除产品 ID 946。你能给我一些建议吗?谢谢!

更新

我试过像这样修改函数,但我在 wp 中仍然遇到一些错误。

代码

function woocommerce_bookings_kalendar( $statuses, $order ) { 
// Get items in order
    $items = $order->get_items(); 

// Loop for all items
    foreach ( $items as $item ) {
       $product_id = $item['product_id'];

if ( $product_id == 946 ) {
            $statuses[]= 'unpaid';

return $statuses;
}
}
}
add_filter('woocommerce_booking_is_paid_statuses', 'woocommerce_bookings_kalendar');

错误:

Fatal error: Uncaught ArgumentCountError: Too few arguments to function woocommerce_bookings_kalendar()

更新 2

为了避免"Fatal error: Uncaught ArgumentCountError: Too few arguments: ..."错误,应该需要声明hook参数的个数(variables),当有多个时,在add_filter()函数中如:

add_filter( 'woocommerce_booking_is_paid_statuses', 'filter_booking_is_paid_statuses', 10, 2 );
function filter_booking_is_paid_statuses( $statuses, $order ) { 
    // Do something

    return $statuses;
}

这将解决此错误。

But the hook woocommerce_booking_is_paid_statuses, located in includes/class-wc-bookings-google-calendar-connection.php file of WooCommerce booking plugin and has a unique variable argument $statuses.

So in your code $order will be always null and $items = $order->get_items(); will throw another error.

因此无法使用此挂钩获取订单详细信息。


要从 WooCommerce Booking Google 日历同步中排除特定的未付款预订,您可以尝试另外使用 woocommerce_bookings_gcalendar_sync 过滤器挂钩。

因此您的代码替换将是:

add_filter( 'woocommerce_booking_is_paid_statuses', 'filter_booking_is_paid_statuses' );
function filter_booking_is_paid_statuses( $statuses ) { 
    return array_merge( $statuses, array('unpaid') );
}

add_filter( 'woocommerce_bookings_gcalendar_sync', 'filter_bookings_gcalendar_sync', 10, 2 );
function filter_booking_has_status( $event, $booking ){
    $excl_product_id = 946;

    if( $booking->get_status() === 'unpaid' && $booking->get_product_id() !== $excl_product_id ) {
        $event = new Google_Service_Calendar_Event(); // Get an empty event Object
        $event->setid( $booking->get_google_calendar_event_id() ); // Set Id
    }
    return $event;
}

代码进入活动子主题(或活动主题)的 functions.php 文件。未经测试它可以工作。