wordpress 在Woocommerce Bookings插件中使用Cron事件安排提醒电子邮件

k3fezbri  于 5个月前  发布在  WordPress
关注(0)|答案(1)|浏览(63)

我真的找不到类似的问题,所以在这里它去(提前道歉的长度):
我们使用Woocommerce Bookings插件让客户通过WordPress网站进行预订。然而,Woocommerce中的提醒电子邮件始终设置为1天,并且无法(轻松)更改。由于Woocommerce没有提供更改提醒日期的简单方法,我们决定尝试(重新)使用cron事件来安排提醒。
因此,使用下面的代码,我们尝试提前2天而不是1天为每个新预订安排提醒:

add_action('woocommerce_booking_confirmed',  'onReservationConfirmed', 2, 2);
add_action('woocommerce_booking_paid', 'onReservationConfirmed', 1, 2);

function onReservationConfirmed($reservationId, $reservation)
{
  error_log('booking paid / confirmed');
  // get_current_reminder_days() gets the saved value from the db
  $days_before_reminder_is_sent = get_current_reminder_days();

  // calculate time when reminder should be scheduled based on when the event starts
  $timezone_addition = -wc_booking_timezone_offset();
  $event_start = $reservation->all_day ? strtotime( 'midnight', $reservation->start ) : $reservation->start;
  $scheduled_time = $timezone_addition + strtotime( '-' . absint( apply_filters( 'woocommerce_bookings_remind_before_days', $days_before_reminder_is_sent ) ) . ' day', $event_start );

  // check if a cron event for this reminder already exists and if so uneschedule it
  $next_event_timestamp = wp_next_scheduled( 'wc-booking-reminder', array($reservationId ));
    if ( $next_event_timestamp ) {
    error_log('exists' . $next_event_timestamp);
    wp_unschedule_event($next_event_timestamp, 'wc-booking-reminder', array($reservationId), true);
    }

  // schedule reminder at desired time
  wp_schedule_single_event( $scheduled_time , 'wc-booking-reminder', array( $reservationId ) );
}

字符串
现在,事件肯定会触发,但是:

*当它更改为状态paid时,没有找到$next_event_timestamp(这是有意义的,也是预期的),但它会提前 *1天而不是2天 * 安排cron事件。
*当它更改为状态确认,一个$next_event_timestamp被发现,如果我注销是否wp_uneschedule_event返回true(根据their docs,它应该如果它是成功的取消计划)它做-这意味着它必须有取消计划的东西之前,然后安排一个新的事件.除了,这个 * 事件也是提前1天安排,而不是2天 *.

在这两种情况下,我都注销了时区和预订id,它们和钩子的名称都与预定的cron事件的名称相匹配。
有趣的是:

*如果我取消预订,然后再次确认,它将再次触发事件,但这一次,它 * 实际上会按预期安排cron事件 * -提前2天。

我能想到的唯一区别是,在取消预订后,没有现有的cron事件可以取消计划,所以绝对没有“10分钟内创建的重复事件”,就像their docs state一样,会取消一个新计划的事件。
但话又说回来,在第一种情况下,它是否也应该变成有偿状态?
我假设在WP代码中的某个地方,有其他东西触发了这个初始事件的调度,但我真的不知道如何修复这个问题或测试它。
有人能帮忙吗?我们的代码有什么问题吗?我误解了文档吗?我需要以不同的方式调用函数吗?
任何建议将不胜感激!

bybem2ql

bybem2ql1#

有一个非常简单的方法来更改Woo Bookings的发送日期。这段代码可以做到这一点:

add_filter('woocommerce_bookings_remind_before_days', function() {
    return 3;
});

字符串
给予一个尝试!

相关问题