2016-02-28 33 views
14

Zwykle wooCommerce powinien automatycznie uzupełniać zamówienia na produkty wirtualne. Ale tak nie jest i to jest prawdziwy problem, nawet BŁĘDY.WooCommerce: Automatycznie realizuj płatne zamówienia (w zależności od metod płatności)

Więc w tym momencie można znaleźć Somme przydatnych rzeczy (ale nie bardzo wygodne):

1) Kod fragment (które można znaleźć w docs woocommerce):

/** 
* Auto Complete all WooCommerce orders. 
*/ 
add_action('woocommerce_thankyou', 'custom_woocommerce_auto_complete_order'); 
function custom_woocommerce_auto_complete_order($order_id) { 
    if (! $order_id) { 
     return; 
    } 

    $order = wc_get_order($order_id); 
    $order->update_status('completed'); 
} 

Ale ten fragment nie działa dla BACS *, Płacić przy dostawie i Sprawdź metody płatności. Dla metod płatności bramek Paypal i kart kredytowych jest w porządku.

* BACS jest bezpośrednie Banku metoda płatności przelew

I ...

2) Wtyczka: woocommerce autouzupełniania Zamówienia

Wtyczka ta działa dla wszystkich metod płatności , ale nie dla inne Bramki kart kredytowych p metody płatności.

Moje pytanie:

Używanie (jako baza) fragmencie woocommerce w pkt 1:

Jak można zaimplementować kod warunkowy w oparciu o metody płatności woocommerce?

mam na myśli coś takiego: jeśli metody płatności nie są „BACS”, „Zapłać z góry” i „Sprawdź”, a następnie zastosować Fragment kodu (Status aktualizacji do „uzupełnienia” dla płatnych zleceń dotyczących produktów wirtualnych).

Nie jestem programistą mega ekspertami wooCommerce, więc nie znalazłem jeszcze sposobu określania metod płatności w zamówieniach woocommerce.

Niektóre pomoc będzie bardzo miłe.

Dzięki.

Odpowiedz

20

Znalazłem rozwiązanie tego problemu (działa z WC 3+):

/** 
* AUTO COMPLETE PAID ORDERS IN WOOCOMMERCE 
*/ 
add_action('woocommerce_thankyou', 'custom_woocommerce_auto_complete_paid_order', 10, 1); 
function custom_woocommerce_auto_complete_paid_order($order_id) { 
    if (! $order_id) 
    return; 

    $order = wc_get_order($order_id); 

    // No updated status for orders delivered with Bank wire, Cash on delivery and Cheque payment methods. 
    if (('bacs' == get_post_meta($order_id, '_payment_method', true)) || ('cod' == get_post_meta($order_id, '_payment_method', true)) || ('cheque' == get_post_meta($order_id, '_payment_method', true))) { 
     return; 
    } 
    // "completed" updated status for paid Orders with all others payment methods 
    else { 
     $order->update_status('completed'); 
    } 
} 

Kod idzie w pliku function.php aktywnego motywu dziecka (lub aktywnego tematu).

Z pomocą tego postu: How to check payment method on a WooCommerce order by id?

z tym: get_post_meta($order_id, '_payment_method', true); od helgatheviking

drut Bank Pobranie i sprawdzić metody płatności są ignorowane i trzymają oryginalny stan zamówienia.

Zaktualizowany kod zgodności z WC 3.0+ (2017-06-10)



Ulepszona wersja dla woocommerce 3+ (2018)

add_action('woocommerce_thankyou', 'wc_auto_complete_paid_order', 20, 1); 
function wc_auto_complete_paid_order($order_id) { 
    if (! $order_id) 
     return; 

    // Get an instance of the WC_Product object 
    $order = wc_get_order($order_id); 

    // No updated status for orders delivered with Bank wire, Cash on delivery and Cheque payment methods. 
    if (in_array($order->get_payment_method(), array('bacs', 'cod', 'cheque', ''))) { 
     return; 
    // Updated status to "completed" for paid Orders with all others payment methods 
    } else { 
     $order->update_status('completed'); 
    } 
} 

Kod przechodzi do pliku function.php aktywnego dziecka motyw (lub aktywny motyw).

+1

Tak jak powiedziałem wcześniej, genialnie. – TARKUS

+3

Twoje rozwiązania były niezwykle pomocne w moich pytaniach i problemach WooCommerce. – TARKUS