如何在 WooCommerce 中 x 分钟或 x 小时后取消待处理的付款订单

Posted

技术标签:

【中文标题】如何在 WooCommerce 中 x 分钟或 x 小时后取消待处理的付款订单【英文标题】:How to cancel a pending payment order after x Minutes or x hour in WooCommerce 【发布时间】:2019-10-31 16:30:28 【问题描述】:

@LoicTheAztec 回答 this Question 的延续是一个很好的解决方案。但我需要对其进行一些更新。我想将时间延迟更新为 30 分钟或 1 小时,而不是 5 天。

它还应该适用于订单状态挂起/暂停。

问题是当我每天尝试使用此代码执行“待付款”时,它会执行最后一个自动取消的订单。

所以代码应该避免最后一个订单或者应该检查下订单的时间。

add_action( 'woocommerce_order_status_changed', 'daily_cancel_unpaid_orders', 10, 4 );
    function daily_cancel_unpaid_orders( $order_id, $old_status, $new_status, $order ) 
        // Enable the process to be executed daily
        if( in_array( $new_status, array('processing', 'completed') ) 
            && get_option( 'unpaid_orders_daily_process' ) < time() ) :

        $days_delay = 1; // <=== SET the delay (number of days to wait before cancelation)

        $one_day    = 24 * 60 * 60;
        $today      = strtotime( date('Y-m-d') );

        // Get unpaid orders (5 days old)
        $unpaid_orders = (array) wc_get_orders( array(
            'limit'        => -1,
            'status'       => 'pending',
            'date_created' => '<' . ( $today - ($days_delay * $one_day) ),
        ) );

        if ( sizeof($unpaid_orders) > 0 ) 
            $cancelled_text = __("The order was cancelled due to no payment from customer.", "woocommerce");

            // Loop through WC_Order Objects
            foreach ( $unpaid_orders as $unpaid_order ) 
                $order->update_status( 'cancelled', $cancelled_text );
            
        
        // Schedule the process to the next day (executed once restriction)
        update_option( 'unpaid_orders_daily_process', $today + $one_day );

        endif;
    

【问题讨论】:

这很奇怪。最后一个订单如何通过'date_created' =&gt; '&lt;' . ( $today - ($days_delay * $one_day) ) 约束?此外,我在您的代码中没有看到任何将时间间隔减少到 30m 或 1h 的迹象……我说得对吗? 是的,我想知道如何设置时间现在是一天 【参考方案1】:

由于该动作仅在订单状态发生变化时调用,如果在 30m 或 1h 时间间隔内没有新事件,则可能不会调用。无论如何,如果您想将间隔更改为 1h,您应该执行以下操作:

add_action( 'woocommerce_order_status_changed', 'hourly_cancel_unpaid_orders', 10, 4 );
    function hourly_cancel_unpaid_orders( $order_id, $old_status, $new_status, $order ) 
        // Enable the process to be executed daily
        if( in_array( $new_status, array('processing', 'completed') ) 
            && get_option( 'unpaid_orders_hourly_process' ) < time() ) :

        $hours_delay = 1; // <=== SET the delay (number of hours to wait before cancelation)

        $one_hour    = 60 * 60;
        $current_hour      = strtotime( date('Y-m-d H:00:00') );

        // Get unpaid orders (1 hours old)
        $unpaid_orders = (array) wc_get_orders( array(
            'limit'        => -1,
            'status'       => 'pending',
            'date_created' => '<' . ( $current_hout - ($hours_delay * $one_hour) ),
        ) );

        if ( sizeof($unpaid_orders) > 0 ) 
            $cancelled_text = __("The order was cancelled due to no payment from customer.", "woocommerce");

            // Loop through WC_Order Objects
            foreach ( $unpaid_orders as $unpaid_order ) 
                $order->update_status( 'cancelled', $cancelled_text );
            
        
        // Schedule the process to the next day (executed once restriction)
        update_option( 'unpaid_orders_hourly_process', $current_hour + $one_hour );

        endif;
    

我更改的主要内容是在 strtotime( date('Y-m-d H:00:00') ) 行中添加了小时,因此该函数在一天内运行的每次时间都不相同。

如果你想有 30m 的间隔,你应该改变它,这样它就会像 2:30 3:00 这样的时间......我认为代码是这样的:

$current_time = strtotime( date('Y-m-d H:i:00') );
$current_time = $current_time - $current_time % (30 * 60);

请让我知道这段代码是否符合您的要求。

关于你说的最后一个订单会自动取消:我想是因为它的状态是pending,并且将是completed。所以我们通过第一个 if 并且它也会出现在 $unpaid_orders 查询中。 您可以通过以下方式检查您要取消的订单是否与上一个订单不同:

foreach ( $unpaid_orders as $unpaid_order ) 
    if ( $unpaid_order->get_id() != $order_id ) 
        $order->update_status( 'cancelled', $cancelled_text );
    

【讨论】:

以上是关于如何在 WooCommerce 中 x 分钟或 x 小时后取消待处理的付款订单的主要内容,如果未能解决你的问题,请参考以下文章

在 X 天 WooCommerce 订单后发送自定义电子邮件 [重复]

如何在 Java 中将毫秒转换为“X 分钟,x 秒”?

尝试用 Woocommerce 购物车上的删除文本替换“x”

Woocommerce“删除产品”删除 X 并替换为图像

禁用 Woocommerce 购物车订单项数量价格计算

sh 每隔X分钟继续尝试一个命令,并在Y分钟过后停止,或命令成功