【问题标题】:WooCommerce auto restore stock on order cancelWooCommerce 订单取消时自动恢复库存
【发布时间】:2018-02-03 11:22:17
【问题描述】:

我正在寻找一种在取消订单时自动恢复库存的解决方案。我在客户网站上使用 PayU 网关,它通过在等待付款时设置所有订单暂停并在 24 小时后取消它们(如果没有有效付款)来工作。但是,这意味着 WooCommerce 用于冻结库存并在给定时间后补货的内置机制不起作用(因为支付网关将状态设置为暂停)。

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

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

【问题讨论】:

    标签: php wordpress woocommerce payu


    【解决方案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' );
    }
    

    希望对你有帮助。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-07-14
    • 1970-01-01
    • 2014-04-17
    • 2020-03-09
    • 1970-01-01
    • 2018-07-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多