将 Woocommerce 订阅更新并同步到自定义日期

arm*_*ive 4 php wordpress woocommerce woocommerce-subscriptions

我们有一个客户正在运送订阅产品(实际上是包含四到五个产品捆绑包的复合产品),并且他们每周提供送货服务。他们的交货日期始终是星期四。Woocommerce 订阅允许同步到特定日期,因此我们选择了“对齐订阅续订日”选项,并且在给定产品中,我们将每个选项设置为在星期四进行(“每 4 周”、“每第三周”等)

产品同步设置的屏幕截图

我们的情况需要注意的是,前一天(周三)或周四收到的订单无法在该周履行,需要将其开始日期/交货日期推迟到下周四。为此,我们编写了一个functions.php使用woocommerce_subscriptions_product_first_renewal_payment_time钩子的函数:

<?php
function rem_check_renewal_date( $first_renewal_timestamp, $product_id, $from_date_param, $timezone ) {

  if ( date('D') == 'Wed' || date('D') == 'Thu' ) {

    $from_date_param = strtotime('Thursday next week');
    return $from_date_param;

  } else {

    // Nothing needs to be done, because we must be on a Fri thru Tue
    return;

  }

}

add_filter( 'woocommerce_subscriptions_product_first_renewal_payment_time', 'rem_check_renewal_date', 10, 4);
?>
Run Code Online (Sandbox Code Playgroud)

现在我们已经做到了这一点,我们可以看到结账上的一些字段似乎正在正确更新。例如,在下一次付款日期(我们将其更改为下一次交货)下,它正确显示下周而不是今天(在撰写本文时恰好是星期四)。 购物车截图

但并非订阅仪表板中的所有字段/列值都会更改。例如,实际开始日期列显示收到订单的日期。

订阅概述的屏幕截图

您还可以在 Woocommerce 发送的确认电子邮件中看到,开始日期被列为当前日期,但根据我们的挂钩,“下次付款”已移动一周。

电子邮件订单确认截图

当我们在星期三下测试订单时,开始日期列显示星期三。如果它的真正用途是作为“收到订单”日期,这是有道理的,所以我的问题是这样的:

需要更新哪些(如果有)其他列和/或值,以便将前一天收到的订单或交货日移至下周?我们需要确保后续订单保持在 2 周、3 周、4 周的计划内,并与更改后的首次付款日期保持一致。但我不确定仅使用上面的钩子更改第一个付款日期是否足够,并且文档没有详细说明。

arm*_*ive 5

WC_Subscription调用的对象公开了一个函数update_dates(),该函数采用与订阅列表仪表板(和其他区域)中使用的值匹配的日期键数组。

函数签名是WC_Subscription::update_dates( $dates, $timezone ). 我相信一个对象必须被实例化;我认为这个方法不能静态调用。订阅功能参考这里。

记录的参数(作为要在$dates数组中传递的键)是:

  1. start
  2. trial_end
  3. next_payment
  4. last_payment
  5. end

数组本身是必需的,但我不认为每个单独的键都需要填充一个值。例如,订阅插件生成的默认订单通常没有日期trial_end或end日期(除非以这种方式单独配置)。

使用操作钩子(例如woocommerce_checkout_subscription_created(订阅操作参考)),您可以使用$subscription参数(它是 的实例)WC_Subscription,并执行以下操作:

function push_subscriptions_to_next_week($subscription, $order, $recurring_cart) {
    // The new date calculation of +7 days is just an example
    $new_dates = array(
        'start' => date('Y-m-d H:i:s', strtotime('+7 days', time())),
        'next_payment' => date('Y-m-d H:i:s', strtotime('+7 days', time()))
    );

    $subscription->update_dates($new_dates, 'site');
}

add_action( 'woocommerce_checkout_subscription_created', 'push_subscriptions_to_next_week', 10, 3);
Run Code Online (Sandbox Code Playgroud)

日期需要采用 MySQL 日期/时间格式 (Ymd H:i:s),因此我更新了代码示例以反映这一点。