计算 WooCommerce 中现有订单的运费 methods/rates
Calculate shipping methods/rates within an existing order in WooCommerce
我基本上是在尝试复制购物车页面上的功能,用户可以在其中添加他们的 zip code
并计算可用的运费,但我试图从后端从内部进行一个已经创建的订单。
我找不到直接从 WC_Order
实例执行此操作的方法,所以我的下一个最佳选择是清除购物车会话,将订单中的所有项目添加到购物车会话,然后尝试计算它。
这是我目前所拥有的。我一直纠结于如何计算整个订单的费率。
$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.
尝试使用:
// Calculate totals
WC()->cart->calculate_totals();
WC()->cart->calculate_shipping();
// Retrieve the shipping total
$shipping_total = WC()->cart->get_shipping_total();
WC_Cart class 应该具有重新创建您可能需要的任何购物车功能所需的所有方法。我建议您通读并熟悉此处的 class 定义...
好的,多亏了@mujuonly,我才弄明白了。
以下是获取所有计算的运费的方法,与在购物车页面上显示的方式相同。
// 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']
将具有订单内产品在该位置可用的所有运费。
注意:这不是答案,我无法发表评论,因此我写在这里。
就我而言,接受的答案有问题:
如果客户已经在购物车中添加了一些商品,它们将会丢失,因为以下代码行:
WC()->cart->empty_cart()
相反,购物车中装满了过去订单中的商品。
到目前为止,似乎有必要使用购物车来正确计算运输包裹。如果是这样,我可以创建当前购物车的克隆然后计算运输包裹吗?我不想在进行此计算时影响客户的原始购物车。
我基本上是在尝试复制购物车页面上的功能,用户可以在其中添加他们的 zip code
并计算可用的运费,但我试图从后端从内部进行一个已经创建的订单。
我找不到直接从 WC_Order
实例执行此操作的方法,所以我的下一个最佳选择是清除购物车会话,将订单中的所有项目添加到购物车会话,然后尝试计算它。
这是我目前所拥有的。我一直纠结于如何计算整个订单的费率。
$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.
尝试使用:
// Calculate totals
WC()->cart->calculate_totals();
WC()->cart->calculate_shipping();
// Retrieve the shipping total
$shipping_total = WC()->cart->get_shipping_total();
WC_Cart class 应该具有重新创建您可能需要的任何购物车功能所需的所有方法。我建议您通读并熟悉此处的 class 定义...
好的,多亏了@mujuonly,我才弄明白了。
以下是获取所有计算的运费的方法,与在购物车页面上显示的方式相同。
// 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']
将具有订单内产品在该位置可用的所有运费。
注意:这不是答案,我无法发表评论,因此我写在这里。 就我而言,接受的答案有问题:
如果客户已经在购物车中添加了一些商品,它们将会丢失,因为以下代码行:
WC()->cart->empty_cart()
相反,购物车中装满了过去订单中的商品。
到目前为止,似乎有必要使用购物车来正确计算运输包裹。如果是这样,我可以创建当前购物车的克隆然后计算运输包裹吗?我不想在进行此计算时影响客户的原始购物车。