WooCommerce 订阅 - 自动完成续订订单和订阅状态

WooCommerce Subscriptions - Automatically complete renewal orders and Subscription status

我在一个使用 WooCommerce 订阅和 WooCommerce 会员资格的网站上工作。它出售每年续订的订阅。

唯一使用的支付网关是支票(重命名为通过发票支付),因此所有续订都是手动续订。发票会发送给客户(在 WooCommerce 之外),店主在付款后在管理员中将订单标记为已完成。

订阅状态与最新订单状态相关联:

由于发票是通过外部会计系统发送和处理的,客户希望自动完成续订订单,这样用户的会员访问权限就不会中断。

我看过类似的问题,例如这里,我 运行 遇到了类似的问题。

Change subscription status to active based on order id WooCommerce

我已经测试了挂钩 woocommerce_new_order 并且可以看到它针对所有订单触发,包括续订。

使用 wcs_get_subscriptions_for_order(),可以将 'renewal' 作为 order_type 传递,以测试给定订单是续订订单还是新客户。

我有一小段代码来检查新订单,如果适用则更新它,然后更新订阅状态。但是,似乎我的第一个 if 块被跳过了——它总是运行到 else 块中的代码。

此外,如果我将更新订单和子状态的行移动到 else 块(因此它确实会更新所有订单),订单状态会更新但子保持为暂停状态。

我猜肯定有一些触发器,如果​​从管理员更新订单或通过未触发的付款更新订单,通常会调用该触发器,但我无法从文档中看到它会是什么。

任何人都可以告诉我这里哪里出了问题吗?

<?php

/**
 * Autocomplete Renewal Orders
 */

function ctz_autocomplete_renewal_order($order_id) {
  
  /**
   * Check if the order is associated with a subscription 
   * 
   * WC Subscriptions gives us a function to obtain the related orders for a subscription in an array. The second parameter allows us to retrieve only renewal orders.
   * 
   * We can use this function to check if the given order ID is for a new customer order or an existing customer's renewal. 
   * 
   * If this array returns blank, it's a first order, and should be skipped over.
   */
  
  // Get related Subscriptions 
  
  $subscriptions = wcs_get_subscriptions_for_order($order_id, array('order_type' => 'renewal'));
  
  if(is_array($subscriptions) && !empty($subscriptions) ) :                                 
    
    // This is a renewal order - change the status 
  
    $order = wc_get_order($order_id);
    
    $order->update_status( 'completed');
    
    $order->save();
    
    // Check and update the subscription status
    
    activate_subscriptions_for_order($order);
    
    // Log the change
    
    $message = $order_id . " Renewal automatically completed.";
  
    ctz_custom_logs('autorenewals', $message);
  
  else :
    
  // This is a new order - leave unchanged 
  
    $message = $order_id . " Initial order - status unchanged.";
  
    ctz_custom_logs('autorenewals', $message);
  
  endif;
 
}

add_action('woocommerce_new_order', 'ctz_autocomplete_renewal_order', 11, 1);

?>

仅供参考,我使用的日志记录功能仅用于调试并将给定消息记录到文件中。

提前致谢。

add_filter('wcs_renewal_order_created', 'wcs_after_create_renewal_order', 10, 2);

function wcs_after_create_renewal_order($renewal_order, $subscription) {

    // Set the current renewal order as completed.
    $renewal_order->update_status('completed');
    $renewal_order->add_order_note( __( 'Renewal automatically processed' ) );

    // Set the corresponding subscription as active.
    $subscription->update_status('active');
    return $renewal_order;
}

挂钩 wcs_renewal_order_created 只有在创建续订订单后才会触发。只需将上面的代码片段添加到您的活动主题 functions.php 文件中。