2017-08-25 106 views
0

我正在尋找解決方案,以便在取消訂單時自動恢復股票。我在客戶的網站上使用PayU網關,它可以在等待付款時將所有訂單設置爲暫停狀態,並在沒有有效付款的情況下在24小時後將其取消。但是,這意味着WooCommerce內置凍結庫存機制並在給定時間後重新進貨不起作用(因爲支付網關將狀態設置爲暫停狀態)。WooCommerce在訂單取消時自動恢復股票

Gerhard Potgieter有一個名爲WooCommerce Auto Restore Stock的插件,但它是一個oldie,我無法在WordPress插件存儲庫或Codecanyon中找到類似的解決方案。

也許有人偶然發現一個解決方案,以自動恢復與WC 3.0+一起使用的已取消訂單的庫存?

回答

0

根據woocommerce github問題here,他們說(24小時持有股票&取消無補貨)是正確的行爲。訂單可能由於各種原因被取消 - 不正確的庫存水平,錯誤的產品,用戶選擇等等,因此庫存的重新增量應該完全是(手動的)管理決策。

所以,我嘗試重寫我的孩子主題的功能.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'); 
} 

希望它能幫助。