2016-08-07 45 views
1

Ich möchte alle Zahlungs-Gateways unter besonderen Situation deaktivieren:
Ich habe 2 spezielle Produkte, die ich nicht bei der Kasse mit einem anderen Produkt kombiniert werden möchte.Deaktivieren Sie alle Zahlungen Gateway, wenn es bestimmte Produkte in den Warenkorb

Lassen Sie uns sagen, dass meine "special" Produkte IDs 496 und 484 sind. Alle anderen sind "normale" Produkte.

  1. , wenn eine dieser „special“ Produkte in den Warenkorb gelegt ist, möchte ich „paypal“ beispielsweise deaktivieren.

  2. , wenn ein Kunde in seinem Wagen hat, auf einmal, ein „special“ Produkt und ein „normales“ Produkt, mag ich alle Zahlungen Gateway deaktivieren, so kann er nicht die Kasse.

Dies ist mein Code:

//disable add to cart if 
add_filter('woocommerce_available_payment_gateways', 'filter_gateways', 1); 

function filter_gateways($gateways) 
{ 
    global $woocommerce; 

    foreach ($woocommerce->cart->cart_contents as $key => $values) { 
     // store product IDs in array 
     $nonPPproducts = array(496,484);   

     if (in_array($values['product_id'], $nonPPproducts)) { 
      unset($gateways['cod'], $gateways['bacs'], $gateways['cheque'], $gateways['stripe']); 
     } elseif (in_array($values['product_id'], $nonPPproducts) && in_array($values['product_id'])) {   
      unset($gateways['under-review'], $gateways['cod'], $gateways['bacs'], $gateways['cheque'], $gateways['stripe']); 
     } 
    } 

    return $gateways; 
} 

Aber ich kann if-Anweisung nur die erste funktioniert nicht herausfinden, warum ... Mit anderen Worten, was auch immer die Situation, alle Zahlungs-Gateways außer deaktiviert sind under-review Zahlungs-Gateways.

Was mache ich falsch?
Wie kann ich das erreichen?

Dank

+0

1) globale Variablen verwenden; 2) hart codierte Werte werden nicht empfohlen. Sie könnten auch 2 * wrapper * -Funktionen in der letzten 'if' für die' unset' mit einem aussagekräftigen Namen erstellen. –

+0

nur neugierig, haben Sie in Betracht gezogen, nicht erlaubt es in den Warenkorb hinzugefügt werden oder warnen beim Versuch, es hinzuzufügen der Wagen? Die Idee ist, den Kunden so schnell wie möglich wissen zu lassen, dass er die Bestellung nicht in einem Einkaufswagen haben kann, anstatt Zeit damit zu verbringen, danach zu fragen, dass er es erneut tun muss. –

+0

@RyanVincent, wäre sogar cool, wenn ich das tun könnte –

Antwort

3

für WooCommerce 3 Aktualisiert

Zuerst denke ich, dass in_array($values['product_id']) in Ihrem Code als richtig Zustand und so Ihre sonst Aussage ist nie "true" nicht funktioniert. Dann, als ein Kunde viele Elemente in seinem Wagen haben kann, je nach Kundenwunsch aufeinanderfolgenden Entscheidungen, mit Ihrem Code gibt es viele redundante Gateway ständig entsticht sein ...

Hier ist der Code revisited (Sie müssen den Wunsch setzen ungesetzt Gateways in jeder Aussage):

add_filter('woocommerce_available_payment_gateways', 'filter_gateways', 1); 
function filter_gateways($gateways){ 

    // storing special product IDs in an array 
    $non_pp_products = array(496, 484); 

    // Needed variables 
    $is_non_prod = false; 
    $is_prod = false; 
    $count = 0; 

    foreach (WC()->cart->get_cart() as $cart_item) { 
     // count number of items if needed (optional) 
     $count++; 
     $product = $cart_item['data']; 
     if(! empty($product)){ 
      $product_id = method_exists($product, 'get_id') ? $product->get_id() : $product->id; 
      if (in_array($product_id, $non_pp_products) && ! $is_non_prod) 
       $is_non_prod = true; 

      if (!in_array($product_id, $non_pp_products) && !$is_prod) 
       $is_prod = true; 

     } 
    } 
    if ($is_non_prod && ! $is_prod) // only special products 
    { 
     // unset only paypal; 
     unset($gateways['paypal']); 
    } 
    elseif ($is_non_prod && $is_prod) // special and normal products mixed 
    { 
     // unset ALL GATEWAYS 
     unset($gateways['cod'], 
       $gateways['bacs'], 
       $gateways['cheque'], 
       $gateways['paypal'], 
       $gateways['stripe'], 
       $gateways['under-review']); 
    } 
    elseif (! $is_non_prod && $is_prod) // only normal products (optional) 
    { 
     // (unset something if needed) 
    } 
    return $gateways; 
} 

Natürlich dieser Code geht auf function.php Datei Ihrer aktiven Kind Thema oder Thema.