2017-12-08 4 views
1

Im Grunde versuche ich die Flatrate Methode Id flat_rate:7deaktiviert zu machen, wenn es Wagenpositionen, die die Versandklasse „Roller“ (ID 92) haben.ausblenden Versandmethode für bestimmte Versandklassen in WooCommerce

Dies ist der Code, den ich versucht:

add_filter('woocommerce_package_rates', 'wf_hide_shipping_method_based_on_shipping_class', 10, 2); 

function wf_hide_shipping_method_based_on_shipping_class($available_shipping_methods, $package) 
{ 
    $hide_when_shipping_class_exist = array(
     92 => array(
      'flat_rate:7' 
     ) 
    ); 

    $shipping_class_in_cart = array(); 
    foreach(WC()->cart->cart_contents as $key => $values) { 
     $shipping_class_in_cart[] = $values['data']->get_shipping_class_id(); 
    } 

    foreach($hide_when_shipping_class_exist as $class_id => $methods) { 
     if(in_array($class_id, $shipping_class_in_cart)){ 
      foreach($methods as & $current_method) { 
       unset($available_shipping_methods[$current_method]); 
      } 
     } 
    } 

    return $available_shipping_methods; 
} 

Versandklasse ID 92 der Versandklasse und ich möchte flat_rate:7 für sie verstecken.

Meine Website ist dies: http://www.minimoto.me/ Wordpress: 4.8.4 WooCommerce: 3.1.1

Jede Hilfe wird sehr geschätzt.

+1

Es tut mir leid, herausgegeben ich meine Frage –

+1

Ich habe beantwortet Ihre Frage die. Wie Sie sehen werden, ist dies auf sehr einfache Weise möglich. Bitte versuchen Sie es und geben Sie mir Feedback. Vielen Dank. – LoicTheAztec

Antwort

1

sollten Sie versuchen stattdessen diese kürzere, kompakte und effektive Art und Weise:

add_filter('woocommerce_package_rates', 'hide_shipping_method_based_on_shipping_class', 10, 2); 
function hide_shipping_method_based_on_shipping_class($rates, $package) 
{ 
    if (is_admin() && ! defined('DOING_AJAX')) 
     return; 

    // HERE define your shipping class to find 
    $class = 92; 

    // HERE define the shipping method to hide 
    $method_key_id = 'flat_rate:7'; 

    // Checking in cart items 
    foreach(WC()->cart->get_cart() as $cart_item){ 
     // If we find the shipping class 
     if($cart_item['data']->get_shipping_class_id() == $class){ 
      unset($rates[$method_key_id]); // Remove the targeted method 
      break; // Stop the loop 
     } 
    } 
    return $rates; 
} 

-Code geht in function.php Datei Ihres aktiven Kind Thema (oder Thema) oder auch in jeder Plugin-Datei.

Getestet und funktioniert.

Manchmal müssen Sie möglicherweise Versandmethoden zu Versandbereichen aktualisieren, dann deaktivieren/speichern und wieder aktivieren/speichern Sie Ihre "Flatrates" Versandmethoden.


Update für viele verschiedene Versandarten (in Bezug auf Ihre Kommentare):

add_filter('woocommerce_package_rates', 'hide_shipping_method_based_on_shipping_class', 10, 2); 
function hide_shipping_method_based_on_shipping_class($rates, $package) 
{ 
    if (is_admin() && ! defined('DOING_AJAX')) 
     return; 

    // HERE define your shipping class to find 
    $class = 92; 

    // HERE define the shipping methods you want to hide 
    $method_key_ids = array('flat_rate:7', 'local_pickup:3'); 

    // Checking in cart items 
    foreach(WC()->cart->get_cart() as $cart_item){ 
     // If we find the shipping class 
     if($cart_item['data']->get_shipping_class_id() == $class){ 
      foreach($method_key_ids as $method_key_id){ 
       unset($rates[$method_key_id]); // Remove the targeted methods 
      } 
      break; // Stop the loop 
     } 
    } 
    return $rates; 
} 

geprüft und Arbeiten ...

+0

Das hat perfekt funktioniert, vielen Dank! –

+0

Der Code funktioniert immer noch perfekt, aber ich habe noch eine Frage, für die ich keinen ganz neuen Thread öffnen wollte. Wie würde ich den Code ändern, um mehrere Versandmethoden für eine bestimmte Versandklasse zu verbergen? Momentan mache ich das mit mehreren Versionen von 'add_filter', aber ich bin mir sicher, dass es einen eleganteren Weg gibt. –

+0

@NiklasBuschner Sie können das in einer einzigartigen Funktion tun ... – LoicTheAztec

Verwandte Themen