Aktualisieren Sie WooCommerce „Flatrate“-Versandkosten mit jQuery

Lesezeit: 4 Minuten

Benutzeravatar von SorenPeter
SörenPeter

Ich versuche, die Versandkosten zu aktualisieren, nachdem die Adresse eingegeben wurde. Wenn der Kunde beginnt, die Adresse einzugeben, hilft die Autovervollständigungsfunktion dem Kunden, den Straßennamen, das Gebäude, das Stockwerk und die Seite zu finden.

Sobald die Adresse eingegeben wurde, berechnet JavaScript die Entfernung und den Preis.

Dann wird der Preis per AJAX versendet shipment.php

Es ist mein Ziel, dass der Versand die Versandkosten entsprechend aktualisiert.

Ich habe versucht:

include '../../../../wp-load.php';

add_action( 'woocommerce_flat_rate_shipping_add_rate','add_another_custom_flat_rate', 10, 2 );
function add_another_custom_flat_rate( $method, $rate ) {
       $new_rate = $rate;
       $new_rate['cost'] = 50; // Update the cost to 50
       $method->add_rate( $new_rate );
     }

Aber ohne Glück.

Ich habe auch diese Anleitung befolgt und eine weitere Versandmethode hinzugefügt: Tuts
https://code.tutsplus.com/tutorials/create-a-custom-shipping-method-for-woocommerce–cms-26098

Aber noch einmal, ich kann den Preis nicht aktualisieren, sobald die Adresse eingegeben wurde.

Benutzeravatar von LoicTheAztec
LoicTheAztec

ich denke, dass Du brauchst nicht Fragen Sie Ajax ab, um den Preis zu aktualisieren direkt für diese berechneten Versandkosten und brauchst du nicht eine benutzerdefinierte Versandmethode wie in Ihrem Code oder verlinkten Tutorial.

ES GIBT DREI SCHRITTE:

1) In Ihrer bestehenden Ajax-gesteuerten PHP-Funktion legen Sie den berechneten Preis in einem benutzerdefinierten WC_Session-Attribut fest, wo $shipping_cost Variable ist der gesammelte Wert der berechneten Versandkosten, die über JS Ajax übergeben werden:

WC()->session->set( 'shipping_calculated_cost', $shipping_cost );

Dann in jQuery Ajax-Ereignis „bei Erfolg“ aktualisieren Sie die Kasse mit Folgendem:

$('body').trigger('update_checkout');

Dadurch werden die Checkout-Daten aktualisiert…


2) In der benutzerdefinierten Funktion eingehakt woocommerce_package_rates Filer Hook erhalten Sie den Sessionwert der berechneten Versandkosten…

WICHTIG: Unter WooCommerce-Einstellungen > Versand werden Sie Satz Die “Flatrate” kosten zu 1

Im Funktionscode legen Sie den Standardpreis für diese Pauschale fest (der verwendet wird, wenn die Versandkostenberechnung noch nicht existiert):

add_filter('woocommerce_package_rates', 'update_shipping_costs_based_on_cart_session_custom_data', 10, 2);
function update_shipping_costs_based_on_cart_session_custom_data( $rates, $package ){

    if ( is_admin() && ! defined( 'DOING_AJAX' ) )
        return $rates;

    // SET HERE the default cost (when "calculated cost" is not yet defined)
    $cost="50";

    // Get Shipping rate calculated cost (if it exists)
    $calculated_cost = WC()->session->get( 'shipping_calculated_cost');

    // Iterating though Shipping Methods
    foreach ( $rates as $rate_key => $rate_values ) {
        $method_id = $rate_values->method_id;
        $rate_id = $rate_values->id;

        // For "Flat rate" Shipping" Method only
        if ( 'flat_rate' === $method_id ) {
            if( ! empty( $calculated_cost ) ) {
                $cost = $calculated_cost;
            }
            // Set the rate cost
            $rates[$rate_id]->cost = number_format($rates[$rate_id]->cost * $cost, 2);
            // Taxes rate cost (if enabled)
            foreach ($rates[$rate_id]->taxes as $key => $tax){
                if( $rates[$rate_id]->taxes[$key] > 0 ){ // set the new tax cost
                    $taxes[$key] = number_format( $rates[$rate_id]->taxes[$key] * $cost, 2 );
                    $has_taxes = true;
                } else {
                    $has_taxes = false;
                }
            }
            if( $has_taxes )
                $rates[$rate_id]->taxes = $taxes;
        }
    }
    return $rates;
}

Der Code wird in die function.php-Datei Ihres aktiven untergeordneten Designs (oder aktiven Designs) oder in eine beliebige Plugin-Datei eingefügt.


3) Aktualisieren Sie die Versandcaches (wird manchmal benötigt):

  • Leeren Sie zuerst Ihren Warenkorb.
  • Dieser Code ist bereits in Ihrer function.php-Datei gespeichert.
  • Gehen Sie in die Einstellungen einer Versandzone und deaktivieren Sie eine “Flatrate”. (Zum Beispiel) und speichern”. Dann “Flatrate” wieder aktivieren und “speichern”. Sie sind fertig und können es testen.

Das sollte für Sie funktionieren,

Wenn Sie viele haben unterschiedliche “Flatrates” nach Versandzonenmüssen Sie einige Änderungen an meinem Code vornehmen, wenn die Standardkosten für jeden anders sind …

  • Vielen Dank für Ihre Antwort. Ich habe Sie drei Schritte genau befolgt. Ich kann sehen, dass WC()->session->set( ‘shipping_calculated_cost’, $_POST[‘shipping_costs’] ) richtig eingestellt ist. Ich kann sehen, dass WooCommerce den Warenkorb aktualisiert (es blinkt). Der Preis für die Flatrate bleibt jedoch 1. Fehlt mir etwas? Mit freundlichen Grüßen.

    – SorenPeter

    29. November 2017 um 16:23 Uhr


  • @ user1576298 das ist nicht normal, denn wenn die “shipping_calculated_cost” nicht in meinem Code enthalten sind, werden sie durch den Standardpreis ersetzt, den Sie darin festgelegt haben (also nicht 1). versuchen Sie es erneut, um die Flatrate in den Versandarten zu deaktivieren/speichern zu aktivieren/speichern… abmelden… Browser-Cache leeren… die zugehörigen Coockies domain.name löschen… und versuchen Sie es bitte erneut

    – LoicTheAztec

    29. November 2017 um 17:05 Uhr


  • Ich habe jetzt versucht, Browsercache leeren, deaktivieren/speichern + aktivieren/speichern der Flatrate. Aber immer noch ohne Glück. Ich frage mich: Muss ich die Variable nicht setzen: $rates ?

    – SorenPeter

    29. November 2017 um 18:17 Uhr

  • ES KLAPPT! Der Code hatte einen kleinen kleinen Fehler. foreach ( $rates as $rate_key => $rate ) { $method_id = $rate_values->method_id; $rate_id = $rate_values->id; ….. musste foreach sein ( $rates as $rate_key => $rate ) { $method_id = $rate->method_id; $rate_id = $rate->id; // Für “Flatrate”-Versandmethode Aber OMG!!! DANKE SOOOOO VIEL!! Wenn du jemals in Dänemark vorbeischaust, kaufe ich dir ein Bier oder eine Limonade

    – SorenPeter

    29. November 2017 um 18:51 Uhr

  • @HorheGarcia Dieser Code ist getestet und funktioniert so wie er ist … Wenn es für Sie mit einem zusätzlichen funktioniert WC()->cart->calculate_shipping(); es ist einfach schön und gut. Wenn es nützlich war und Sie möchten/möchten, können Sie diese Antwort positiv bewerten.

    – LoicTheAztec

    20. Mai 2018 um 16:16 Uhr


1442560cookie-checkAktualisieren Sie WooCommerce „Flatrate“-Versandkosten mit jQuery

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

Privacy policy