【问题标题】:Woocommerce auto cancel on-hold after X daysX 天后 Woocommerce 自动取消暂停
【发布时间】:2018-08-01 14:33:29
【问题描述】:

因为我将使用离线支付(银行对帐单 - 巴西的标准)。我想要实现的是在 9 天后自动取消“暂停”订单,也就是方坯到期的时候。我找到了一些代码参考:一个来自woocommerce github,另一个来自stackoverflow。代码的作用(在我看来有点乱)反映了“待定”取消到“暂停”。在 github 上,他们说使用 date_modified 参数来拉取最后一小时的订单很重要。我已经对此进行了测试,但它不起作用。不知道是什么问题。

    <?php

    function wc_foo_cancel_unpaid_onhold_orders() {
        global $wpdb;

        $held_duration = get_option('woocommerce_hold_stock_minutes');

        if ( $held_duration < 1 || 'yes' !== get_option( 'woocommerce_manage_stock')) {
            return;
        }

        $unpaid_orders = wc_foo_cancel_unpaid_onhold_orders( strtotime( '-' . absint( $held_duration) . ' MINUTES'. current_time( 'timestamp')));

        if ( $unpaid_orders) {
                foreach ( $unpaid_orders as $unpaid_orders ){
                        $order = wc_get_order( $unpaid_order);

                    if ( apply_filters( 'woocommerce_cancel_unpaid_order', 'checkout' == $order->get_created_via(), $order ) ) {
                        $order ->update_status( 'cancelled', _( 'Unpaid order cancelled - time limite reached.', 'woocommerce'));
                    }
                }
        }

}

add_action( 'woocommerce_cancel_unpaid_orders', 'wc_foo_cancel_unpaid_onhold_orders');

function wc_foo_get_unpaid_onhold_orders( $date ){
    global $wpdb;

    $args = array(
    'date_modified' => '>' . ( time() - HOUR_IN_SECONDS ),
    'status' => 'on-hold',);
    $orders = wc_get_orders( $args );

    $unpaid_orders = $wpdb->get_col( $wpdb->prepare( "
    SELECT posts.id
    FROM {$wpdb->posts} AS posts
    WHERE posts.posts_type IN ('" . implode( "','", wc_get_order_types()). "')
    AND posts.post_status = 'wc-on-hold'
    AND posts.date_modified < %s
    ", date( 'Y-m-d H:i:s', absint( $date)) ) );
}

?>

【问题讨论】:

  • @LoicTheAztec 是原始代码的一部分:user-images.githubusercontent.com/6853605/…
  • 它正在复制原始的 wc_cancel_unpaid_orders(据我了解
  • 这基本上是 Webdados 在这里试图实现的目标:github.com/woocommerce/woocommerce/issues/18191
  • 无论如何,您的复制无法输出任何内容……我会看看并告诉您……
  • @LoicTheAztec true...我在互联网上跑来跑去,并在我想要实现的目标方面得到了一些帮助

标签: php wordpress woocommerce hook-woocommerce


【解决方案1】:

所以我在 Wordpress.org 获得了来自 @danaharrison 的一些帮助来实现这一目标。因此代码仅适用于“暂停”订单。

 // To change the amount of days just change '-7 days' to your liking.

function get_unpaid_submitted() {        
                global $wpdb;

                $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('-7 days') ) ) );

                return $unpaid_submitted;
        }

        // This excludes check payment type.
        function wc_cancel_unpaid_submitted() {        
                $unpaid_submit = 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', __( 'Pagamento não identificado e cancelado.', 'woocommerce') );
                                }
                        }
                }        
        }
        add_action( 'woocommerce_cancel_unpaid_submitted', 'wc_cancel_unpaid_submitted' );
        /* End of code. */

【讨论】:

    猜你喜欢
    • 2019-09-11
    • 1970-01-01
    • 2019-10-06
    • 1970-01-01
    • 1970-01-01
    • 2015-09-30
    • 2016-03-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多