Woocommerce aktualisiert die Versandmethoden im Checkout über Ajax

Lesezeit: 4 Minuten

Was ich versuche zu erreichen: In Woocommerce muss ich ein Datum überprüfen, das über ein Datumsauswahlfeld geliefert wird, wenn der Benutzer ein Datum auswählt, und dann die Versandoptionen entsprechend über Ajax aktualisieren, damit Dinge wie kostenloser Versand herausgenommen werden können, wenn sie nicht angemessen sind.

Was ich aktuell weiß/herausgefunden habe: Ich habe derzeit das jQuery-Ereignis ausgelöst und durch ein Datum an ein benutzerdefiniertes Skript gesendet, was ich irgendwie tun muss. Ich konnte in den Woocommerce-Klassen keine Funktion finden, die nur die Versanddaten zurückgibt, also glaube ich nicht, dass ich das aufrufen und als Fragment zurückgeben kann, wie sie es bereits für die Kasse tun.

Allerdings habe ich das gefunden

WC_AJAX::update_order_review()

enthält einen Aktionsaufruf, und ich habe erfolgreich eine Funktion mit dieser Aktion verbunden, UND ich konnte die auslösen

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

die die Aktion auslöst, die den Checkout-Überprüfungsblock aktualisiert.

Meine eigentliche Frage: All dies ist großartig, und ich sehe nicht so aus, als würde es in die richtige Richtung gehen, aber ich kenne Woocommerce nicht gut genug, um zu wissen, wie ich die Versandmethoden in meiner Hook-Aktion abrufen kann, um sie bei Bedarf zu deaktivieren. Weiß jemand, ob ich sie durch das globale Objekt $woocommerce bekommen und sie dann vom Rest dieser WC_AJAX-Methode lesen lassen kann??

Jede Hilfe hier wäre sehr willkommen.

** Anmerkungen: Ja, ich weiß, das ist ein ‘t’ und kein ‘$’ in der jQuery. Kein Fehler

Also, für diejenigen unter Ihnen, die das vielleicht brauchen, es erforderte ein wenig Fummelei in Woocommerce, wegen der Art und Weise, wie sie die Ausgabe von Warenkorb-/Checkout-Werten für Versand- und Zahlungsoptionen handhaben, aber am Ende konnte ich es mit den Hooks von Woocommerce realisieren , und sehr wenig Plugin-Modifikation, also eine ziemlich saubere Lösung.

Im Grunde genommen habe ich Woocommerce-Sitzungen, zwei Hooks und einen Javascript-Trigger verwendet, der die Überprüfung der Checkout-Bestellung aktualisiert.

Durch eine Kombination der woocommerce_checkout_update_order_review Haken, der in der passiert WC_AJAX::update_order_review und Verwendung des Vorgenannten $( 'body' ).trigger( 'update_checkout' ); anrufen, könnte ich mich in die Aktion einklinken, die den Checkout-Überprüfungsblock aktualisiert. So weit, ist es gut.

Was ich in dieser Funktion getan habe, war zu prüfen, ob das Feld einen Wert hatte, und wenn ja, speichere ihn in der WC()->session. DANN seit WC_AJAX::update_order_review Anrufe woocommerce_order_review() Um alle aktualisierten Warenkorb- und Versandmethoden zu erhalten, habe ich in die mit dieser Funktion verknüpfte Vorlage geschaut und einen anderen Haken gefunden, woocommerce_review_order_before_shippingwodurch ich die Versandmethoden ändern kann, bevor die Warenkorbvorlage durchläuft und die Versandoptionen aufbaut wc_cart_totals_shipping_html().

Nun, ich weiß, du denkst, warte, ich brauche Checkout-Versandmethoden, keine Warenkorb-, aber in Wirklichkeit scheinen sie ein und dasselbe zu sein.

Hoffentlich helfen meine verschwendeten Stunden jemand anderem mit einem ähnlichen Problem.

Prost.

  • Danke. Dies war die einzige Antwort, die ich finden konnte, die versuchte, so etwas zu tun.

    – DarkNeuron

    6. Dezember 2016 um 10:04 Uhr

Woocommerce aktualisiert die Versandmethoden im Checkout uber
DarkNeuron

Trevors Antwort hat also nicht genau für mich funktioniert (vielleicht hat sich WC seit seiner Erstellung geändert), sie hat mich jedoch in die richtige Richtung geführt.

Ich habe einige etwas andere Filter verwendet. Das Problem, das ich lösen musste, war das Hinzufügen/Entfernen bestimmter Versandoptionen basierend auf einem benutzerdefinierten Feld.

add_action('woocommerce_checkout_update_order_review', function ($rawFields) {
            // This function checks for the value of my custom field on the checkout page.
            parse_str($rawFields, $checkoutFields);
            $this->myField = $checkoutFields['my_field'] ?? null;
});

add_filter('woocommerce_shipping_packages', 'modifyShippingPackages']);

public function modifyShippingPackages($packages)
    {
        if ($this->myField) {
            //.. modify $packages. In my case, I had to remove shipping methods.
            $rates = $packages[0]['rates'];

            $newRates = array_filter($rates, function ($shippingRate)
            {
                // figure out what should be in the rates
            });

            $packages[0]['rates'] = $newRates;

            $session = WC()->session;
            $session->set('shipping_method_counts', [count($newRates)]);
            $session->set('chosen_shipping_methods', [$newRates[0]->id]);
        }

        return $packages;
    }

Das obige Snippet ist eine unvollständige Version meines Codes, sollte aber den Punkt vermitteln. Es kann leicht durch Tippen getestet werden jQuery( 'body' ).trigger( 'update_checkout' ); in Ihrer Javascript-Konsole.

Danke für die Hinweise Trevor.

Woocommerce aktualisiert die Versandmethoden im Checkout uber
Dávid Biró

Falls jemand den Warenkorb aktualisieren möchte:

foreach (WC()->cart->get_cart() as $key => $value) {
    WC()->cart->set_quantity($key, $value['quantity']+1);
    WC()->cart->set_quantity($key, $value['quantity']);
    break;
}

Ändern Sie die Menge und ändern Sie sie dann zurück. Und der Versand wird neu berechnet.

(Mehr als 5 Stunden Code-Browsing, nächstes Mal werde ich den gesamten Webshop codieren und ein gutes Framework verwenden, das vollständig anpassbar ist OMG)

  • Oder Sie können WC()->cart->calculate_shipping() in Kombination mit dem Hook woocommerce_checkout_update_order_review verwenden, siehe: gist.github.com/neamtua/bfdc4521f5a1582f5ad169646f42fcdf

    – Ali Alwash

    16. August 2018 um 19:54 Uhr


  • Wie können Sie dies mit WC 3.0+ in einer vollständigen Funktion für sich tun? Fordern Sie einen vollständigen Code an, der in die functions.php kopiert werden kann. Danke

    – KoolPal

    18. Mai 2019 um 14:12 Uhr

1002210cookie-checkWoocommerce aktualisiert die Versandmethoden im Checkout über Ajax

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

Privacy policy