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

问题描述

我遇到了从 woocommerce 预订 Google 日历同步中排除 1 个未付款状态的产品的问题。我有一个客户正在预订他们付款的个人课程。这些课程我需要在未付费状态下与我的谷歌日历同步。 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

为了避免“致命错误:未捕获的参数计数错误:参数太少:……”错误,应该需要声明钩子参数的数量(变量),当有多个时,在 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;
}

这将解决这个错误。

但是钩子 woocommerce_booking_is_paid_statuses,位于 WooCommerce 预订插件的 includes/class-wc-bookings-google-calendar-connection.php 文件中,并且有一个唯一的变量参数 $statuses

因此,在您的代码中,$order 将始终为 null,而 $items = $order->get_items();抛出另一个错误

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


要从 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',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 文件中。未经测试它可以工作。