2017-08-25 5 views
0

Ich bin auf der Suche nach einer Lösung zur automatischen Wiederherstellung von Aktien, wenn die Bestellung storniert wird. Ich benutze PayU Gateway auf der Website meines Kunden und es funktioniert, indem alle Aufträge in Warteposition gesetzt werden, wenn auf die Zahlung gewartet wird, und sie nach 24 Stunden storniert werden, wenn keine gültige Zahlung erfolgt. Dies bedeutet jedoch, dass der integrierte WooCommerce-Mechanismus zum Einfrieren von Material und zum anschließenden Wiederauffüllen nach einer bestimmten Zeit nicht funktioniert (da das Zahlungs-Gateway den Status auf "Halten" setzt).WooCommerce auto Restore Lager auf Bestellung abbrechen

Es gab ein Plugin namens WooCommerce Auto Restore Stock von Gerhard Potgieter, aber es ist ein Oldie und ich konnte keine ähnliche Lösung im WordPress Plugin Repository oder Codecanyon finden.

Vielleicht ist jemand auf eine Lösung gestoßen, um den Bestand für stornierte Bestellungen automatisch wiederherzustellen, der mit WC 3.0+ funktioniert?

Antwort

0

Laut Woocommerce Github Ausgabe here, sagen sie, dass (24 Stunden halten Lager & Abbrechen ohne Auffüllung) ist korrektes Verhalten. Bestellungen können aus einer Vielzahl von Gründen storniert werden - falsche Lagerbestände, fehlerhafte Produkte, Benutzerwahl usw. Daher sollte die erneute Erhöhung des Lagerbestandes eine (manuelle) Admin-Entscheidung sein.

Also, ich versuche, die Funktion in meinem Kind Thema functions.php zu überschreiben und es funktioniert!

Hier ist der Code:

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

Hoffe, es hilft.

Verwandte Themen