当前位置: 首页 > 知识库问答 >
问题:

根据订单id将订阅状态更改为“活动”

司空昊阳
2023-03-14

首先,感谢一个人帮我写了一个脚本,将订单状态更改为完成(脚本如下)。

不幸的是,它不会触发订阅进入活动状态。当我在WooCommerce中手动更改订单状态时,它会这样做。所以我的想法是根据给定的订单号激活订阅。

如何根据WooCommerce中的order_id将订阅状态从“待定”更改为“活跃”?

这里有一个代码,当我使用100%优惠券时,它会改变订单状态:在functions.php

<?php

add_action('woocommerce_checkout_order_processed', 'custom_woocommerce_auto_complete_order');
function custom_woocommerce_auto_complete_order($order_id)
{
    if (!$order_id) {
        return;
    }

      $order = wc_get_order($order_id);
    if ($order->get_total() == 0) {
        $order->update_status('processing');
        $order->update_status('completed');
    }
}
 

我发现像这样的smth可以激活这些订阅,但我无法实现,也许有人可以帮我解决这个问题?下面是我在github上找到的代码

/**
     * Activates all the subscriptions created by a given order.
     *
     * @param WC_Order|int $order The order or ID of the order for which subscriptions should be marked as activated.
     * @since 1.0
     */
    public static function activate_subscriptions_for_order( $order ) {

        $subscriptions = wcs_get_subscriptions_for_order( $order );

        if ( ! empty( $subscriptions ) ) {

            foreach ( $subscriptions as $subscription ) {

                try {
                    $subscription->update_status( 'active' );
                } catch ( Exception $e ) {
                    // translators: $1: order number, $2: error message
                    $subscription->add_order_note( sprintf( __( 'Failed to activate subscription status for order #%1$s: %2$s', 'woocommerce-subscriptions' ), is_object( $order ) ? $order->get_order_number() : $order, $e->getMessage() ) );
                }
            }

            do_action( 'subscriptions_activated_for_order', $order );
        }
    } 

我试过这个但不管用:

add_action('woocommerce_checkout_order_processed', 'custom_woocommerce_auto_complete_order');
function custom_woocommerce_auto_complete_order($order_id)
{
    if (!$order_id) {
        return;
    }

      $order = wc_get_order($order_id);
    if ($order->get_total() == 0) {
        $order->update_status('processing');
        $order->update_status('completed');
    }
}


do_action('woocommerce_checkout_order_processed', 'subscriptions_activated_for_order', $order_id );
function activate_subscriptions_for_order( $order_id ) {

  $subscriptions = wcs_get_subscriptions_for_order( $order_id );

  if ( ! empty( $subscriptions ) ) {

    foreach ( $subscriptions as $subscription ) {

      try {
        $subscription->update_status( 'active' );
      } catch ( Exception $e ) {
        // translators: $1: order number, $2: error message
        $subscription->add_order_note( sprintf( __( 'Failed to activate subscription status for order #%1$s: %2$s', 'woocommerce-subscriptions' ), is_object( $order_id ) ? $order->get_order_number() : $order_id, $e->getMessage() ) );
      }
    }

  }
}

最好的问候

共有1个答案

宗政财
2023-03-14

您的代码中存在错误和错误。你可以试着把所有东西合并在一起,比如:

add_action('woocommerce_checkout_order_processed', 'custom_woocommerce_auto_complete_order');
function custom_woocommerce_auto_complete_order($order_id)
{
    if (!$order_id) {
        return;
    }

    $order = wc_get_order($order_id);

    if ($order->get_total() == 0) {
        // $order->update_status('processing'); // Unneeded as you complete the order
        $order->update_status('completed');
    }

    $subscriptions = wcs_get_subscriptions_for_order( $order );
    
    if ( ! empty( $subscriptions ) ) {
        activate_subscriptions_for_order( $order );
    }
}

代码进入函数。活动子主题(或活动主题)的php文件。它可以工作。

或者你可以保留:

add_action('woocommerce_checkout_order_processed', 'custom_woocommerce_auto_complete_order');
function custom_woocommerce_auto_complete_order($order_id)
{
    if (!$order_id) {
        return;
    }

    $order = wc_get_order($order_id);

    if ($order->get_total() == 0) {
        // $order->update_status('processing'); // Unneeded as you complete the order
        $order->update_status('completed');
    }
}

并使用订单状态为“完成”时触发的钩子woocommerce\u order\u status\u completed,如下所示激活与订单相关的订阅:

add_action( 'woocommerce_order_status_completed', 'order_complete_activate_subscription', 10, 2 );
function order_complete_activate_subscription( $order_id, $order ) {
    $subscriptions = wcs_get_subscriptions_for_order( $order );
    
    if ( ! empty( $subscriptions ) ) {
        activate_subscriptions_for_order( $order );
    }
}

代码进入函数。活动子主题(或活动主题)的php文件。它可以工作。

 类似资料:
  • 1.自动收货完成如何设置? 商家可以在【交易设置】里面设置自动确认收货时间,从发货时间开始后粉丝没有在手机端点击确定收货,后台系统到时间自动确定收货。 2.订单可以修改价格吗? 订单在待付款状态下可以修改价格。 3.已经完成的订单为什么自动就关闭? 用户通过额外方式导入的订单数据,导入的订单数据为待支付状态,订单的创建时间到现在时间超出了订单自动关闭时间 所以订单自动关闭了。 4.支付时,扫码提示

  • 我在我的WooCommerce安装中创建了一个自定义订单状态,称为Quote。 现在我想收到一封电子邮件,每当收到一个订单,已经给出了状态栏。我根据这篇有用的文章创建了一个插件:http://www.skyverge.com/blog/how-to-add-a-custom-woocommerce-email/ 我的插件基本上是从文章复制的,我只是更改了电子邮件的内容。我想改变的是什么触发了电子邮

  • 说明 此消息用于确认或取消一个预订单 请求地址 http://api.dc78.cn/Api/bk_state 请求方式 GET 请求参数 参数 参数名称 必填 描述 范例 id 预订单编号 state 状态 目前取值有两个:1,确认预定,-1,取消预订 op 操作员 可选 table 预订桌台 可选 返回 status:1-成功,0-失败 请求方式 INI 请求参数 [action] 描述 ac

  • 我有一些“ChangeMainItem”操作(在我的例子中,它是由外部系统或可能的组件之一调度的)。此操作(例如)仅更新reducer中状态的一个属性(例如)。 我的组件A和B需要对此状态更改做出反应:显示加载指示器、获取其他数据并显示结果。顺序动作可以通过一些异步动作库来完成,但是我应该把调度异步动作放在哪里呢?显然,我不能在组件A和B的reducer中分派异步操作,我也不想将原始操作更改为异步

  • 我正在使用WooCommerce预订,客户可以要求预订,需要得到管理员的确认。如果管理员不确认预订,我希望订单在24小时后自动取消。 从更改伍兹商务订单状态后X时间已通过回答代码,我正在寻找任何协助,以满足我的要求,使用WP cron。

  • web3.eth.clearSubscriptions()方法用来复位订阅状态。注意该方法不能 复位其他包的订阅,例如web3-shh,因为这些包有自己的请求管理器。 调用: web3.eth.clearSubscriptions(flag) 参数: flag:Boolean - 值为true则表示保持同步订阅 返回值: Boolean:复位成功返回true,否则返回false 示例代码: we