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

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

我真的找不到类似的问题,所以就在这里(提前为长度道歉):

我们使用 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 ) );
}


现在,该事件肯定会触发,但是:

  • 当状态更改为已付款时,找不到 $next_event_timestamp (这是有道理的并且符合预期),但它会提前 1 天而不是 2 天安排 cron 事件。
  • 当状态更改为已确认
  • 时,会找到 $next_event_timestamp ,如果我注销 wp_uneschedule_event 是否返回 true (根据 他们的文档,如果成功取消计划,则应该返回 true )它确实如此 - 这意味着它必须在安排新活动之前取消了一些安排。除此之外,此活动也提前 1 天安排,而不是 2 天
  • 在这两种情况下,我都注销了时区和预订 ID,它们和挂钩的名称都与计划的 cron 事件的名称相匹配。

现在有趣的是:

    如果我取消预订
  • ,然后再次确认,它将再次触发该事件,但这一次,它实际上会按预期安排 cron 事件 - 提前 2 天。
  • 我能想到的唯一区别是,取消预订后,没有现有的 cron 事件可以取消安排,因此绝对不存在“10 分钟内创建的重复事件”,正如
他们的文档所述

,这会取消一个新安排的事件具有相同的 $args。 但话又说回来,在第一种情况下,它是否会变成已付款状态?

我假设 WP 代码中的某个地方有其他东西触发了这个初始事件的调度,但我真的不知道如何解决这个问题或测试它。 有人可以帮忙吗?我们的代码有问题吗?我误读了文档吗?我需要以某种方式以不同的方式调用这些函数吗?

如有任何建议,我们将不胜感激!

有一种非常简单的方法可以更改 Woo Bookings 的提醒发送日期。这段小代码就可以解决问题:

wordpress woocommerce cron
1个回答
0
投票

尝试一下!

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