问题描述
我遇到了从 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 文件中。未经测试它可以工作。