在 Woocommerce 中以编程方式自定义运费
Custom shipping rates programmatically in Woocommerce
我想根据 woocommerce 的购物车金额计算自定义运费,我的要求如下,
购物车数量
- 0-10 => £4.99 (shipping_rate_id = flat_rate:12),
- 10-20 => £3.99 (shipping_rate_id = flat_rate:13),
- 20-30 => £2.99 (shipping_rate_id = flat_rate:14),
- 30-40 => £1.99 (shipping_rate_id = flat_rate:15),
- 40 岁以上 => 免费送货 (shipping_rate_id = flat_rate:17)
注意:我们不计算烟草类别的运费。如果有人购买烟草制品,Tobacco
商品价格不用于运费计算。为了做到这一点,所有的烟草制品
添加到免费送货 class (id = 150)。
设置自定义查询来完成上述要求,但它没有像我预期的那样工作
add_filter('woocommerce_package_rates', 'custom_shipping_rates_based_on_shipping_class', 11, 2);
function custom_shipping_rates_based_on_shipping_class($rates, $package) {
if (is_admin() && !defined('DOING_AJAX'))
return;
// HERE define your shipping class to find
$class = array(150);
// HERE define the shipping method to change rates for
$shipping_rate_ids = array('flat_rate:12', 'flat_rate:13', 'flat_rate:14', 'flat_rate:15');
// Initialising
$item_price = $item_qty = $item_total = 0;
// Loop through cart items
foreach($package['contents'] as $cart_item_key => $cart_item) {
$item_shipping_class_id = $cart_item['data'] - > get_shipping_class_id();
if (!in_array($item_shipping_class_id, $class)) {
$item_price += $cart_item['data'] - > get_price(); // Sum line item prices that have target shipping class
$item_qty += $cart_item['quantity']; // Sum line item prices that have target shipping class
$item_total = $item_price * $item_qty;
}
}
// Loop through shipping rates
foreach($rates as $rate_key => $rate) {
if (in_array($rate_key, $shipping_rate_ids)) {
if ($item_total > 0 && $item_total < 10) {
$rates[$rate_key] - > cost = 4.99;
unset($rates['flat_rate:13']);
unset($rates['flat_rate:14']);
unset($rates['flat_rate:15']);
unset($rates['flat_rate:17']);
}
elseif($item_total > 10.01 && $item_total < 20) {
$rates[$rate_key] - > cost = 3.99;
unset($rates['flat_rate:12']);
unset($rates['flat_rate:14']);
unset($rates['flat_rate:15']);
unset($rates['flat_rate:17']);
}
elseif($item_total > 20.01 && $item_total < 30) {
$rates[$rate_key] - > cost = 2.99;
unset($rates['flat_rate:12']);
unset($rates['flat_rate:13']);
unset($rates['flat_rate:15']);
unset($rates['flat_rate:17']);
}
elseif($item_total > 30.01 && $item_total < 40) {
$rates[$rate_key] - > cost = 1.99;
unset($rates['flat_rate:12']);
unset($rates['flat_rate:13']);
unset($rates['flat_rate:14']);
unset($rates['flat_rate:17']);
} else {
$rates[$rate_key] - > cost = 0;
unset($rates['flat_rate:12']);
unset($rates['flat_rate:13']);
unset($rates['flat_rate:14']);
unset($rates['flat_rate:15']);
}
}
}
return $rates;
}
以上代码并不适用于所有场景,请帮助我。
如果您知道每种送货方式的 shipping_rate_id 值,这意味着在 WooCommerce 插件中(WooCommerce > 设置 > 送货 > 送货区域 > 编辑 > 送货方式)您已经为每种单独的送货方式创建并分配运费(或免费)。
所以你不需要再改变每一个的成本。
另外,对于免费送货,运费 ID 将是 free_shipping:17
而不是 flat_rate:17
。
除非您创建了零成本送货方式(固定费率而不是免运费).
工作代码将是:
add_filter('woocommerce_package_rates', 'change_shipping_method_based_on_cart_total', 11, 2);
function change_shipping_method_based_on_cart_total( $rates, $package ) {
// set the shipping class id to exclude
$shipping_class_id = 150;
// initializes the total cart of products
$total_cart = 0;
foreach ( WC()->cart->get_cart() as $cart_item ) {
$product = $cart_item['data'];
// if the product has the shipping class id equal to "$shipping_class_id" it is excluded from the count
if ( $product->get_shipping_class_id() == $shipping_class_id ) {
continue;
}
$qty = $cart_item['quantity'];
$price = $cart_item['data']->get_price();
// add the product line total to the total
$total_cart += $price * $qty;
}
switch ( true ) {
case $total_cart < 10: // £4.99
// only the "flat_rate:12" shipping method will be enabled
unset($rates['flat_rate:13']);
unset($rates['flat_rate:14']);
unset($rates['flat_rate:15']);
unset($rates['flat_rate:17']); // or "unset( $rates['free_shipping:17'] );"
break;
case $total_cart >= 10 && $total_cart < 20: // £3.99
// only the "flat_rate:13" shipping method will be enabled
unset($rates['flat_rate:12']);
unset($rates['flat_rate:14']);
unset($rates['flat_rate:15']);
unset($rates['flat_rate:17']); // or "unset( $rates['free_shipping:17'] );"
break;
case $total_cart >= 20 && $total_cart < 30: // £2.99
// only the "flat_rate:14" shipping method will be enabled
unset($rates['flat_rate:12']);
unset($rates['flat_rate:13']);
unset($rates['flat_rate:15']);
unset($rates['flat_rate:17']); // or "unset( $rates['free_shipping:17'] );"
break;
case $total_cart >= 30 && $total_cart < 40: // £1.99
// only the "flat_rate:15" shipping method will be enabled
unset($rates['flat_rate:12']);
unset($rates['flat_rate:13']);
unset($rates['flat_rate:14']);
unset($rates['flat_rate:17']);
break;
case $total_cart >= 40: // free
// only the "flat_rate:17" or "free_shipping:17" shipping method will be enabled
unset($rates['flat_rate:12']);
unset($rates['flat_rate:13']);
unset($rates['flat_rate:14']);
unset($rates['flat_rate:15']);
break;
}
return $rates;
}
代码已经过测试并且可以工作。代码进入主题的 functions.php
文件。
我想根据 woocommerce 的购物车金额计算自定义运费,我的要求如下,
购物车数量
- 0-10 => £4.99 (shipping_rate_id = flat_rate:12),
- 10-20 => £3.99 (shipping_rate_id = flat_rate:13),
- 20-30 => £2.99 (shipping_rate_id = flat_rate:14),
- 30-40 => £1.99 (shipping_rate_id = flat_rate:15),
- 40 岁以上 => 免费送货 (shipping_rate_id = flat_rate:17)
注意:我们不计算烟草类别的运费。如果有人购买烟草制品,Tobacco 商品价格不用于运费计算。为了做到这一点,所有的烟草制品 添加到免费送货 class (id = 150)。
设置自定义查询来完成上述要求,但它没有像我预期的那样工作
add_filter('woocommerce_package_rates', 'custom_shipping_rates_based_on_shipping_class', 11, 2);
function custom_shipping_rates_based_on_shipping_class($rates, $package) {
if (is_admin() && !defined('DOING_AJAX'))
return;
// HERE define your shipping class to find
$class = array(150);
// HERE define the shipping method to change rates for
$shipping_rate_ids = array('flat_rate:12', 'flat_rate:13', 'flat_rate:14', 'flat_rate:15');
// Initialising
$item_price = $item_qty = $item_total = 0;
// Loop through cart items
foreach($package['contents'] as $cart_item_key => $cart_item) {
$item_shipping_class_id = $cart_item['data'] - > get_shipping_class_id();
if (!in_array($item_shipping_class_id, $class)) {
$item_price += $cart_item['data'] - > get_price(); // Sum line item prices that have target shipping class
$item_qty += $cart_item['quantity']; // Sum line item prices that have target shipping class
$item_total = $item_price * $item_qty;
}
}
// Loop through shipping rates
foreach($rates as $rate_key => $rate) {
if (in_array($rate_key, $shipping_rate_ids)) {
if ($item_total > 0 && $item_total < 10) {
$rates[$rate_key] - > cost = 4.99;
unset($rates['flat_rate:13']);
unset($rates['flat_rate:14']);
unset($rates['flat_rate:15']);
unset($rates['flat_rate:17']);
}
elseif($item_total > 10.01 && $item_total < 20) {
$rates[$rate_key] - > cost = 3.99;
unset($rates['flat_rate:12']);
unset($rates['flat_rate:14']);
unset($rates['flat_rate:15']);
unset($rates['flat_rate:17']);
}
elseif($item_total > 20.01 && $item_total < 30) {
$rates[$rate_key] - > cost = 2.99;
unset($rates['flat_rate:12']);
unset($rates['flat_rate:13']);
unset($rates['flat_rate:15']);
unset($rates['flat_rate:17']);
}
elseif($item_total > 30.01 && $item_total < 40) {
$rates[$rate_key] - > cost = 1.99;
unset($rates['flat_rate:12']);
unset($rates['flat_rate:13']);
unset($rates['flat_rate:14']);
unset($rates['flat_rate:17']);
} else {
$rates[$rate_key] - > cost = 0;
unset($rates['flat_rate:12']);
unset($rates['flat_rate:13']);
unset($rates['flat_rate:14']);
unset($rates['flat_rate:15']);
}
}
}
return $rates;
}
以上代码并不适用于所有场景,请帮助我。
如果您知道每种送货方式的 shipping_rate_id 值,这意味着在 WooCommerce 插件中(WooCommerce > 设置 > 送货 > 送货区域 > 编辑 > 送货方式)您已经为每种单独的送货方式创建并分配运费(或免费)。
所以你不需要再改变每一个的成本。
另外,对于免费送货,运费 ID 将是 free_shipping:17
而不是 flat_rate:17
。
除非您创建了零成本送货方式(固定费率而不是免运费).
工作代码将是:
add_filter('woocommerce_package_rates', 'change_shipping_method_based_on_cart_total', 11, 2);
function change_shipping_method_based_on_cart_total( $rates, $package ) {
// set the shipping class id to exclude
$shipping_class_id = 150;
// initializes the total cart of products
$total_cart = 0;
foreach ( WC()->cart->get_cart() as $cart_item ) {
$product = $cart_item['data'];
// if the product has the shipping class id equal to "$shipping_class_id" it is excluded from the count
if ( $product->get_shipping_class_id() == $shipping_class_id ) {
continue;
}
$qty = $cart_item['quantity'];
$price = $cart_item['data']->get_price();
// add the product line total to the total
$total_cart += $price * $qty;
}
switch ( true ) {
case $total_cart < 10: // £4.99
// only the "flat_rate:12" shipping method will be enabled
unset($rates['flat_rate:13']);
unset($rates['flat_rate:14']);
unset($rates['flat_rate:15']);
unset($rates['flat_rate:17']); // or "unset( $rates['free_shipping:17'] );"
break;
case $total_cart >= 10 && $total_cart < 20: // £3.99
// only the "flat_rate:13" shipping method will be enabled
unset($rates['flat_rate:12']);
unset($rates['flat_rate:14']);
unset($rates['flat_rate:15']);
unset($rates['flat_rate:17']); // or "unset( $rates['free_shipping:17'] );"
break;
case $total_cart >= 20 && $total_cart < 30: // £2.99
// only the "flat_rate:14" shipping method will be enabled
unset($rates['flat_rate:12']);
unset($rates['flat_rate:13']);
unset($rates['flat_rate:15']);
unset($rates['flat_rate:17']); // or "unset( $rates['free_shipping:17'] );"
break;
case $total_cart >= 30 && $total_cart < 40: // £1.99
// only the "flat_rate:15" shipping method will be enabled
unset($rates['flat_rate:12']);
unset($rates['flat_rate:13']);
unset($rates['flat_rate:14']);
unset($rates['flat_rate:17']);
break;
case $total_cart >= 40: // free
// only the "flat_rate:17" or "free_shipping:17" shipping method will be enabled
unset($rates['flat_rate:12']);
unset($rates['flat_rate:13']);
unset($rates['flat_rate:14']);
unset($rates['flat_rate:15']);
break;
}
return $rates;
}
代码已经过测试并且可以工作。代码进入主题的 functions.php
文件。