WooCommerce自动恢复订单取消订单

时间:2017-08-25 11:56:56

标签: php wordpress woocommerce payu

我正在寻找解决方案,以便在订单取消时自动恢复库存。我在客户的网站上使用PayU网关,它可以在等待付款时设置所有待机订单,并在24小时后取消订单,如果没有有效付款的话。但是,这意味着WooCommerce内置机制用于冻结库存,然后在给定时间后重新进货并不起作用(因为支付网关将状态设置为保持)。

Gerhard Potgieter有一个名为WooCommerce Auto Restore Stock的插件,但它是一个老人,我无法在WordPress插件库或Codecanyon上找到类似的解决方案。

也许有人偶然发现了一个解决方案,可以自动恢复与WC 3.0 +一起使用的取消订单的库存?

1 个答案:

答案 0 :(得分:1)

根据woocommerce github问题here,他们说(24小时持有股票和取消没有补货)是正确的行为。订单可以由于各种原因而被取消 - 不正确的库存水平,错误的产品,用户选择等等,因此库存的重新增加应该是完全(手动)管理决策。

所以,我尝试覆盖我的孩子主题的functions.php中的函数,它可以工作!

以下是代码:

remove_filter( 'woocommerce_cancel_unpaid_orders', 'wc_cancel_unpaid_orders' );
add_filter( 'woocommerce_cancel_unpaid_orders', 'override_cancel_unpaid_orders' );

function override_cancel_unpaid_orders() {
    $held_duration = get_option( 'woocommerce_hold_stock_minutes' );

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

    $data_store    = WC_Data_Store::load( 'order' );
    $unpaid_orders = $data_store->get_unpaid_orders( strtotime( '-' . absint( $held_duration ) . ' MINUTES', current_time( 'timestamp' ) ) );

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

            if ( apply_filters( 'woocommerce_cancel_unpaid_order', 'checkout' === $order->get_created_via(), $order ) ) {
                //Cancel Order
                $order->update_status( 'cancelled', __( 'Unpaid order cancelled - time limit reached.', 'woocommerce' ) );

                //Restock
                foreach ($order->get_items() as $item_id => $item) {
                    // Get an instance of corresponding the WC_Product object
                    $product = $item->get_product();
                    $qty = $item->get_quantity(); // Get the item quantity
                    wc_update_product_stock($product, $qty, 'increase');
                }
            }
        }
    }
    wp_clear_scheduled_hook( 'woocommerce_cancel_unpaid_orders' );
    wp_schedule_single_event( time() + ( absint( $held_duration ) * 60 ), 'woocommerce_cancel_unpaid_orders' );
}

希望它有所帮助。