2017-08-25 6 views
0

私は、注文がキャンセルされたときに在庫を自動的に復元するソリューションを探しています。私はクライアントのサイトでPayUゲートウェイを使用しています。有効な支払いがない場合は、支払いを待っているすべての注文を保留にし、24時間後にキャンセルします。しかし、これは、WooCommerceが在庫を凍結し、一定時間後に再梱包する仕組みが(支払いゲートウェイがステータスを保留にするため)機能しないことを意味します。WooCommerceの自動在庫を取り消す注文

Gerhard PotgieterのWooCommerce Auto Restore Stockというプラグインがありましたが、これは古いもので、WordPressプラグインリポジトリまたはCodecanyonで同様のソリューションを見つけることができませんでした。

誰かが、WC 3.0+で動作するキャンセル注文の在庫を自動的に復元するソリューションに遭遇したのでしょうか?

答えて

0

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'); 
} 

はそれがお役に立てば幸いです。

関連する問題