Berechnen Sie Versandarten/-tarife innerhalb einer bestehenden Bestellung in WooCommerce
Lesezeit: 5 Minuten
Zen
Ich versuche im Wesentlichen, Funktionen wie auf der Warenkorbseite zu replizieren, wo ein Benutzer seine hinzufügen kann zip code und es berechnet die verfügbaren Versandkosten, aber ich versuche es vom Back-End aus innerhalb einer bereits erstellten Bestellung.
Ich konnte keine Möglichkeit finden, es direkt von zu tun WC_Order Zum Beispiel ist das Nächstbeste, was ich habe, eine Warenkorbsitzung zu löschen, alle Artikel aus der Bestellung zur Warenkorbsitzung hinzuzufügen und dann zu versuchen, sie zu berechnen.
Hier ist, was ich bisher habe. Ich weiß immer nicht, wie ich die Preise für die gesamte Bestellung berechnen soll.
$order_id = isset($_POST['order_id'])?$_POST['order_id']:0;
$country = isset($_POST['country'])?$_POST['country']:0;
$state = isset($_POST['state'])?$_POST['state']:0;
$postcode = isset($_POST['postcode'])?$_POST['postcode']:0;
$city = isset($_POST['city'])?$_POST['country']:0;
$order = wc_get_order( $order_id );
$order_items = $order->get_items();
// Don't know if this would save country of logged in user, or only create a temporary guest user session which is what I'd need
if ( $country != '' ) {
WC()->customer->set_billing_location( $country, $state, $postcode, $city );
WC()->customer->set_shipping_location( $country, $state, $postcode, $city );
} else {
WC()->customer->set_billing_address_to_base();
WC()->customer->set_shipping_address_to_base();
}
// Remove all current items from cart
if ( sizeof( WC()->cart->get_cart() ) > 0 ) {
WC()->cart->empty_cart();
}
// Add all items from the order to the cart
foreach ($order_items as $order_item) {
WC()->cart->add_to_cart($order_item['product_id'], $order_item['qty']);
}
$totals = WC()->shipping->get_packages();
// $totals returns rates but I believe it is per each "package". It's not a cumulative rate like the cart page shows.
So erhalten Sie alle berechneten Versandkosten, so wie sie auf der Warenkorbseite angezeigt werden.
// Post variables
$order_id = isset($_POST['order_id'])?$_POST['order_id']:0;
$country = isset($_POST['country'])?$_POST['country']:0;
$state = isset($_POST['state'])?$_POST['state']:0;
$postcode = isset($_POST['postcode'])?$_POST['postcode']:0;
$city = isset($_POST['city'])?$_POST['city']:0;
// Order and order items
$order = wc_get_order( $order_id );
$order_items = $order->get_items();
// Reset shipping first
WC()->shipping()->reset_shipping();
// Set correct temporary location
if ( $country != '' ) {
WC()->customer->set_billing_location( $country, $state, $postcode, $city );
WC()->customer->set_shipping_location( $country, $state, $postcode, $city );
} else {
WC()->customer->set_billing_address_to_base();
WC()->customer->set_shipping_address_to_base();
}
// Remove all current items from cart
if ( sizeof( WC()->cart->get_cart() ) > 0 ) {
WC()->cart->empty_cart();
}
// Add all items to cart
foreach ($order_items as $order_item) {
WC()->cart->add_to_cart($order_item['product_id'], $order_item['qty']);
}
// Calculate shipping
$packages = WC()->cart->get_shipping_packages();
$shipping = WC()->shipping->calculate_shipping($packages);
$available_methods = WC()->shipping->get_packages();
$available_methods[0]['rates'] enthält alle Versandkosten, die für diesen Standort für Produkte in der Bestellung verfügbar sind.
Können Sie den vollständigen Code aus dem Warenkorb für diese Lösung senden?
– ups1988
22. Juni 2020 um 21:25 Uhr
Können Sie uns mitteilen, wie Sie dies implementiert haben, damit andere dasselbe mit ihrem WC-Back-End tun können?
– inspiriertnz
10. April 2021 um 4:39 Uhr
@inspirednz wurde als Plugin zur Verwaltung manueller Bestellungen im Backend implementiert.
– Zen
13. April 2021 um 15:28 Uhr
Versuchen Sie es mit:
// Calculate totals
WC()->cart->calculate_totals();
WC()->cart->calculate_shipping();
// Retrieve the shipping total
$shipping_total = WC()->cart->get_shipping_total();
Die WC_Cart-Klasse sollte über alle Methoden verfügen, die Sie benötigen, um alle erforderlichen Warenkorbfunktionen neu zu erstellen. Ich schlage vor, dass Sie die Klassendefinition hier durchlesen und sich damit vertraut machen sollten …
Hinweis: Dies ist keine Antwort, ich kann nichts kommentieren, daher schreibe ich hier. In meinem Fall gibt es ein Problem mit der akzeptierten Antwort:
Wenn der Kunde bereits einige Artikel in den Warenkorb gelegt hat, gehen diese aufgrund der folgenden Codezeile verloren:
WC()->cart->empty_cart()
und stattdessen wird der Warenkorb mit den Artikeln in der vergangenen Bestellung gefüllt.
Bisher scheint es so, als wäre die Verwendung des Einkaufswagens notwendig, um die Versandpakete richtig zu berechnen. Wenn ja, gibt es eine Möglichkeit, einen Klon des aktuellen Warenkorbs zu erstellen und dann die Versandpakete zu berechnen? Ich möchte den ursprünglichen Warenkorb meines Kunden bei dieser Berechnung nicht beeinflussen.
Meine Frage und Antwort bezieht sich auf die Berechnung von Versandmethoden aus dem Backend von WordPress. Daher würde dies normalerweise nur vom Administrator oder der Verwaltung von Mitgliedern durchgeführt werden, und in diesem Fall wäre das Leeren des Warenkorbs nicht von Bedeutung, da der Warenkorb der Benutzer, deren Versandmethoden Sie berechnen möchten, nicht geleert würde. Es leert den Warenkorb des aktuell angemeldeten Benutzers. Ich würde so etwas versuchen $cart_contents = WC()->cart->get_cart_contents() dann WC()->cart->empty_cart() und all die andere Logik, und schließlich WC()->cart->set_cart_contents($cart_contents). Habe es nicht getestet.
– Zen
12. November 2019 um 21:16 Uhr
13824200cookie-checkBerechnen Sie Versandarten/-tarife innerhalb einer bestehenden Bestellung in WooCommerceyes
Überprüfen Sie dies
– mujuonly
19. März 2019 um 18:31 Uhr