Woocommerce不会取消处于保留状态的订单

时间:2019-05-20 11:49:35

标签: php wordpress woocommerce

在创建订单后的4小时内,我需要在某些情况下取消保留的订单。

示例:2个客户

第一位客户在下午5:00发出订单,因此其保留状态(我希望订单创建后的4个小时后,如果他不付款,则取消订单,因此必须在9点取消: 00 PM)

第二个客户在5:37下订单,因此其保留状态(我也希望从订单创建之日起4小时后取消订单,如果他不付款,则必须在9时取消): 37)

我希望它在每个订单分别从订单创建日期起4小时后过期后立即取消订单,而不是作为cron作业每4小时工作一次,因此在上一个示例中,如果cron事件从6开始:下午00点,每4小时运行一次,因此第一个客户订单将在10:00 PM过期,第二个客户订单也将在10:00 PM过期。

我在这里Automatically cancel order after X days if no payment in WooCommerce

尝试过解决方案

,但是无法使它在仅按天数定义的4小时后过期,也不知道哪个答案对我来说是最佳方案,对于创建后4小时后要分别取消的每个订单日期不是cron事件,

我使用了上面相关问题中提到的许多解决方案,但是只有当第一个答案起作用时,我才记得这是当管理员/商店经理访问订单页面时..我需要自动完成操作而无需人工干预

这是我在插件中取消订单的代码

<?php


function ash2osh_faw_get_unpaid_submitted() {        
        global $wpdb;
          $options = get_option('woocommerce_' . ASH2OSH_FAW_PAYMENT_METHOD . '_settings');
        $expire_hours =  $options['unpaid_expire'];
        if(!trim($expire_hours)){
            $expire_hours='48';
        }
        $unpaid_submitted = $wpdb->get_col( $wpdb->prepare( "
                SELECT posts.ID
                FROM {$wpdb->posts} AS posts
                WHERE posts.post_status = 'wc-on-hold'
                AND posts.post_date < %s
        ", date( 'Y-m-d H:i:s', strtotime('-'.$expire_hours.' hours') ) ) ); 

        return $unpaid_submitted;
}

function ash2osh_faw_wc_cancel_unpaid_submitted() {        
        $unpaid_submit = ash2osh_faw_get_unpaid_submitted();

        if ( $unpaid_submit ) {                
                foreach ( $unpaid_submit as $unpaid_order ) {                        
                        $order = wc_get_order( $unpaid_order );
                        $cancel_order = True;

                        foreach  ( $order->get_items() as $item_key => $item_values) {                                
                                $manage_stock = get_post_meta( $item_values['variation_id'], '_manage_stock', true );
                                if ( $manage_stock == "no" ) {                                        
                                        $payment_method = $order->get_payment_method();                                        
                                        if ( $payment_method == "cheque" ) {
                                                $cancel_order = False;
                                        }
                                }                                
                        }
                        if ( $cancel_order == True ) {
                                $order -> update_status( 'cancelled', __( 'Unpaid submission expired after hours set in payment plugin options.', 'woocommerce') );
                        }
                }
        }        
}
add_action( 'woocommerce_cancel_unpaid_submitted', 'ash2osh_faw_wc_cancel_unpaid_submitted' );//for customization purposes

这里的第三个解决方案:Automatically cancel order after X days if no payment in WooCommerce经过测试,可以正常工作:但是,我希望在订单未处理/未处理的情况下取消订单,并且如果订单超过4个小时则取消订单在订单创建日期之后,并且计划在30天(而不是每天)运行该日期

1 个答案:

答案 0 :(得分:0)

您尝试过这个吗? Woocommerce auto cancel On-Hold after X days。我和您有同样的问题(但取消时间为72小时),而且也没有付款网关的限制,所以这是我的代码:

int sum = 0;

List<String> sum_list = new ArrayList<>();
List<String> list21 = new ArrayList<>();
list21.add("1 tbsp olive oil plus a drizzle to serve (optional)");
list21.add("1 tbsp olive oil plus a drizzle to serve (optional)");
list21.add("2 tbsp pesto");
list21.add("2 tbsp pesto");
list21.add("2 tbsp pesto");
list21.add("2 tbsp pesto");
int i = 0;
while (i < list21.size()) {

    String str1 = list21.get(i).trim().replaceAll("[0-9]", "");
    String str2 = list21.get(i + 1).trim().replaceAll("[0-9]", "");

    if (str1.equals(str2)) {

        sum += Integer.valueOf(list21.get(i).replaceFirst(".*?(\\d+).*", "$1"))
                + Integer.valueOf(list21.get(i).replaceFirst(".*?(\\d+).*", "$1"));
        // System.out.println("Sum=" + sum);
        try {
            if (!sum_list.isEmpty() && !sum_list.get(sum_list.size() - 1).trim().replaceAll("[0-9]", "").contains(str2)) {
                sum_list.add(sum + " " + str1);
                sum = 0;
            } else sum_list.add(sum + " " + str1);

        } catch (Exception e) {
        }
    }

    i = i + 2;
}
System.out.println(sum_list.toString());