Versandoptionen je nach Warenkorbgewicht und Versandklasse

Lesezeit: 4 Minuten

Versandoptionen je nach Warenkorbgewicht und Versandklasse
epetersen

Ich arbeite an einer WordPress-Site, die WooCommerce verwendet. Ich habe diesen Code gefunden, mit dem ich eine Frachtversandoption basierend auf dem Gewicht festlegen kann. Es hat super funktioniert, bis der Kunde auch die gleiche Frachtversandoption wünschte, wenn eine Frachtversandklasse für ein Produkt ausgewählt wurde.

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

function bbloomer_woocommerce_tiered_shipping( $rates, $package ) {

  if ( WC()->cart->cart_contents_weight < 300 ) {

    if ( isset( $rates['fedex:PRIORITY_OVERNIGHT'], $rates['fedex:FEDEX_2_DAY'], $rates['fedex:FEDEX_GROUND'] ) );

  } else {

    if ( isset( $rates['flat_rate:10'] ) ) unset( $rates['fedex:PRIORITY_OVERNIGHT'], $rates['fedex:FEDEX_2_DAY'],$rates['fedex:FEDEX_GROUND'] );
  }

return $rates;
}

Dann fand ich einen weiteren Code, der eine Versandklasse auf eine Versandoption setzen konnte. Der Code, den ich gefunden habe, war gemein unset Versandoptionen, die verfügbar sind, aber ich möchte isset der frachtversand seit wir unset es über das Warenkorbgewicht. Ich habe jedoch ein Problem, bei dem die Frachtversandklasse nicht mehr auf eingestellt werden kann isset ohne größere Probleme zu verursachen. Unten ist, was ich für den Frachtversand versucht habe.

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

function freight_shipping_class_only( $rates, $package ) {

  $shipping_class_target = 193;
  $in_cart = false;
  foreach( WC()->cart->cart_contents as $key => $values ) {
    if( $values[ 'data' ]->get_shipping_class_id() == $shipping_class_target ) {
      $in_cart = true;
      break;
    } 
  }
  if( $in_cart ) {
    unset( $rates['fedex:PRIORITY_OVERNIGHT'], $rates['fedex:FEDEX_2_DAY'],$rates['fedex:FEDEX_GROUND']  ); // shipping method with ID (to find it, see screenshot below)
    isset( $rates['flat_rate:10'] );
  }
  return $rates;
} 

Gibt es eine Möglichkeit, sowohl das Wagengewicht als auch die Frachtversandklasse in einer Funktion einzustellen? Es wäre ideal, da ich möchte, dass beide genau das Gleiche tun, indem sie unset alle FedEx Versandoptionen und isset die Frachtversandoption.

Lassen Sie mich wissen, wenn Sie mich klarer machen möchten oder wenn Sie Tipps haben.

Danke!

  • Ich habe hier geantwortet, da Sie Ihren Code wirklich vereinfachen und in einer einzigartigen Funktion zusammenführen können… Bitte schauen Sie vorbei und Ihr Feedback wird geschätzt.

    – LoicTheAztec

    24. Juli ’18 um 16:34

Versandoptionen je nach Warenkorbgewicht und Versandklasse
LoicTheAztec

Da Sie zweimal denselben Hook verwenden, können Sie Ihre Funktionen einfach in einem zusammenführen.

Jetzt mit PHP [isset()][1] Sie müssen es als Bedingung in einem verwenden IF -Anweisung, um zu überprüfen, ob eine Variable gesetzt (existiert) ist, aber sie hat außerhalb Ihrer IF-Anweisung in Ihrer Funktion keine Wirkung.

In Ihrer ersten Funktion hat folgendes also keine Auswirkung:

if ( isset( $rates['fedex:PRIORITY_OVERNIGHT'], $rates['fedex:FEDEX_2_DAY'], $rates['fedex:FEDEX_GROUND'] ) );

Sie können stattdessen diesen kompakten und effizienten Code ausprobieren:

add_filter( 'woocommerce_package_rates', 'freight_shipping_class_only', 20, 2 );
function freight_shipping_class_only( $rates, $package ) {
    // HERE the targeted shipping class ID
    $targeted_shipping_class = 193;

    // Loop through cart items and checking
    $found = false;
    foreach( $package['contents'] as $item ) {
        if( $item['data']->get_shipping_class_id() == $targeted_shipping_class ){
            $found = true;
            break;
        }
    } 
    
    // The condition
    if ( isset( $rates['flat_rate:10'] ) && ( WC()->cart->get_cart_contents_weight() >= 300 || $found ) ){
        unset( $rates['fedex:PRIORITY_OVERNIGHT'], $rates['fedex:FEDEX_2_DAY'], $rates['fedex:FEDEX_GROUND'] );
    }

    return $rates;
}

Code geht in die Datei function.php des aktiven Child-Themes (oder des aktiven Themes). Es sollte funktionieren.

Ich habe eine Lösung gefunden, es ist nicht genau das, was ich wollte, aber es funktioniert. Ich habe das Wagengewicht auf etwas über 300 Pfund geändert unset die Versandoptionen von FedEx. Dann unset FedEx Versandoptionen für die Frachtversandklasse. Dadurch blieb die Frachtversandoption bei Nichtfrachtartikeln sichtbar, die ich mit CSS ausgeblendet habe.

Ich bin immer noch offen für einen besseren Weg, dies zu tun. Wenn Sie also Vorschläge haben, senden Sie diese bitte an mich.

Unten ist, was ich am Ende gemacht habe.

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

function bbloomer_woocommerce_tiered_shipping( $rates, $package ) {

if ( WC()->cart->cart_contents_weight < 300 ) {

    if ( isset( $rates['fedex:PRIORITY_OVERNIGHT'], $rates['fedex:FEDEX_2_DAY'], $rates['fedex:FEDEX_GROUND'] ) );

} else {

    if ( isset( $rates['flat_rate:10'] ) ) unset( $rates['fedex:PRIORITY_OVERNIGHT'], $rates['fedex:FEDEX_2_DAY'],$rates['fedex:FEDEX_GROUND'] );
}

 return $rates;
}

/** Freight Shipping Class Only **/
add_filter( 'woocommerce_package_rates', 'freight_shipping_class_only', 10, 2 );

function freight_shipping_class_only( $rates, $package ) {
    $shipping_class_target = 193; 
    $in_cart = false;
    foreach( WC()->cart->cart_contents as $key => $values ) {
        if( $values[ 'data' ]->get_shipping_class_id() == $shipping_class_target ) {
           $in_cart = true;
           break;
        } 
     }
     if( $in_cart ) {
        unset( $rates['fedex:PRIORITY_OVERNIGHT'], $rates['fedex:FEDEX_2_DAY'],$rates['fedex:FEDEX_GROUND']  );
     }
     return $rates;
}

.

419030cookie-checkVersandoptionen je nach Warenkorbgewicht und Versandklasse

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy