根据类别和国家/地区为每件产品添加运费
Add shipping cost on per product based on category and country
在我的 WooCommerce 网站上,我有一些代码可以正常工作,但效果不佳。
对国家/地区的计算工作正常,但是当我添加类别时价格不正确。
这是我的代码:
add_filter( 'woocommerce_get_discounted_price', 'calculate_discounted_price', 10, 2 );
add_filter( 'woocommerce_cart_item_subtotal', 'display_discounted_price', 10, 2 );
function calculate_discounted_price( $price, $values ) {
global $woocommerce, $product;
$countryArray = array( 'AL', 'AD', 'AT', 'BY', 'BE', 'BA', 'BG', 'HR', 'CY', 'CZ', 'DK', 'EE', 'FO', 'FI', 'FR', 'DE', 'GI', 'GR', 'HU', 'IS', 'IE', 'IM', 'IT', 'RS', 'LV', 'LI', 'LT', 'LU', 'MK', 'MT', 'MD', 'MC', 'ME', 'NL', 'NO', 'PL', 'PT', 'RO', 'RU', 'SM', 'RS', 'SK', 'SI', 'ES', 'SE', 'CH', 'UA', 'VA', 'RS' );
$catArray = array('handbags','kids','hats');
if( $woocommerce->customer->get_shipping_country() == 'GB' ) {
foreach ( $woocommerce->cart->cart_contents as $product ) :
if ( has_term( $catArray, 'product_cat', $product['product_id'] ) ) {
$price += 4.50;
} else {
$price += 8.50;
}
endforeach;
} elseif( in_array($woocommerce->customer->get_shipping_country(), $countryArray) ) {
foreach ( $woocommerce->cart->cart_contents as $product ) :
if ( has_term( $catArray, 'product_cat', $product['product_id'] ) ) {
$price += 4.50;
} else {
$price += 12.50;
}
endforeach;
} else {
foreach ( $woocommerce->cart->cart_contents as $product ) :
if ( has_term( $catArray, 'product_cat', $product['product_id'] ) ) {
$price += 8.50;
} else {
$price += 18.50;
}
endforeach;
}
return $price;
}
function display_discounted_price( $values, $item ) {
return wc_price( $item[ 'line_total' ] ).'<br>incl. shipping';
}
当我删除所有 foreach 语句并仅保留国家/地区条件时它工作正常,foreach 循环不知何故导致了问题。
对此提供一些帮助,将不胜感激。
谢谢。
您不需要购物车 foreach 循环来获取产品 ID,如下所示。 我还没有解决你显示的奇怪价格问题,因为它似乎来自产品类别条件。我必须进一步测试,但这段未完成的代码将帮助您理解第一个挂钩函数中的参数是什么:
add_filter( 'woocommerce_get_discounted_price', 'calculate_discounted_price', 10, 3 );
function calculate_discounted_price( $price, $cart_item, $cart_object ) {
$country_arr = array( 'AL', 'AD', 'AT', 'BY', 'BE', 'BA', 'BG', 'HR', 'CY', 'CZ', 'DK', 'EE', 'FO', 'FI', 'FR', 'DE', 'GI', 'GR', 'HU', 'IS', 'IE', 'IM', 'IT', 'RS', 'LV', 'LI', 'LT', 'LU', 'MK', 'MT', 'MD', 'MC', 'ME', 'NL', 'NO', 'PL', 'PT', 'RO', 'RU', 'SM', 'RS', 'SK', 'SI', 'ES', 'SE', 'CH', 'UA', 'VA', 'RS' );
$cats_arr = array('handbags','kids','hats');
// ONLY for logged users (I think)
$user_ship_country = WC()->customer->get_shipping_country();
$product_id = $cart_item['product_id'];
if( $user_ship_country == 'GB' ) {
if ( has_term( $cats_arr, 'product_cat', $product_id ) )
$price += 4.50;
else
$price += 8.50;
} elseif( in_array($user_ship_country, $country_arr) ) {
if ( has_term( $cats_arr, 'product_cat', $product_id ) )
$price += 4.50;
else
$price += 12.50;
} else {
if ( has_term( $cats_arr, 'product_cat', $product_id ) )
$price += 8.50;
else
$price += 18.50;
}
return $price;
}
add_filter( 'woocommerce_cart_item_subtotal', 'display_discounted_price', 10, 2 );
function display_discounted_price( $values, $item ) {
return wc_price( $item[ 'line_total' ] ).'<br>incl. shipping';
}
此外 WC()->customer->get_shipping_country();
仅适用于 log gin 客户(我认为)...
希望对您有所帮助。
BUT For shipping additional costs, I think that you are not using the right hooks…
在我的 WooCommerce 网站上,我有一些代码可以正常工作,但效果不佳。
对国家/地区的计算工作正常,但是当我添加类别时价格不正确。
这是我的代码:
add_filter( 'woocommerce_get_discounted_price', 'calculate_discounted_price', 10, 2 );
add_filter( 'woocommerce_cart_item_subtotal', 'display_discounted_price', 10, 2 );
function calculate_discounted_price( $price, $values ) {
global $woocommerce, $product;
$countryArray = array( 'AL', 'AD', 'AT', 'BY', 'BE', 'BA', 'BG', 'HR', 'CY', 'CZ', 'DK', 'EE', 'FO', 'FI', 'FR', 'DE', 'GI', 'GR', 'HU', 'IS', 'IE', 'IM', 'IT', 'RS', 'LV', 'LI', 'LT', 'LU', 'MK', 'MT', 'MD', 'MC', 'ME', 'NL', 'NO', 'PL', 'PT', 'RO', 'RU', 'SM', 'RS', 'SK', 'SI', 'ES', 'SE', 'CH', 'UA', 'VA', 'RS' );
$catArray = array('handbags','kids','hats');
if( $woocommerce->customer->get_shipping_country() == 'GB' ) {
foreach ( $woocommerce->cart->cart_contents as $product ) :
if ( has_term( $catArray, 'product_cat', $product['product_id'] ) ) {
$price += 4.50;
} else {
$price += 8.50;
}
endforeach;
} elseif( in_array($woocommerce->customer->get_shipping_country(), $countryArray) ) {
foreach ( $woocommerce->cart->cart_contents as $product ) :
if ( has_term( $catArray, 'product_cat', $product['product_id'] ) ) {
$price += 4.50;
} else {
$price += 12.50;
}
endforeach;
} else {
foreach ( $woocommerce->cart->cart_contents as $product ) :
if ( has_term( $catArray, 'product_cat', $product['product_id'] ) ) {
$price += 8.50;
} else {
$price += 18.50;
}
endforeach;
}
return $price;
}
function display_discounted_price( $values, $item ) {
return wc_price( $item[ 'line_total' ] ).'<br>incl. shipping';
}
当我删除所有 foreach 语句并仅保留国家/地区条件时它工作正常,foreach 循环不知何故导致了问题。
对此提供一些帮助,将不胜感激。
谢谢。
您不需要购物车 foreach 循环来获取产品 ID,如下所示。 我还没有解决你显示的奇怪价格问题,因为它似乎来自产品类别条件。我必须进一步测试,但这段未完成的代码将帮助您理解第一个挂钩函数中的参数是什么:
add_filter( 'woocommerce_get_discounted_price', 'calculate_discounted_price', 10, 3 );
function calculate_discounted_price( $price, $cart_item, $cart_object ) {
$country_arr = array( 'AL', 'AD', 'AT', 'BY', 'BE', 'BA', 'BG', 'HR', 'CY', 'CZ', 'DK', 'EE', 'FO', 'FI', 'FR', 'DE', 'GI', 'GR', 'HU', 'IS', 'IE', 'IM', 'IT', 'RS', 'LV', 'LI', 'LT', 'LU', 'MK', 'MT', 'MD', 'MC', 'ME', 'NL', 'NO', 'PL', 'PT', 'RO', 'RU', 'SM', 'RS', 'SK', 'SI', 'ES', 'SE', 'CH', 'UA', 'VA', 'RS' );
$cats_arr = array('handbags','kids','hats');
// ONLY for logged users (I think)
$user_ship_country = WC()->customer->get_shipping_country();
$product_id = $cart_item['product_id'];
if( $user_ship_country == 'GB' ) {
if ( has_term( $cats_arr, 'product_cat', $product_id ) )
$price += 4.50;
else
$price += 8.50;
} elseif( in_array($user_ship_country, $country_arr) ) {
if ( has_term( $cats_arr, 'product_cat', $product_id ) )
$price += 4.50;
else
$price += 12.50;
} else {
if ( has_term( $cats_arr, 'product_cat', $product_id ) )
$price += 8.50;
else
$price += 18.50;
}
return $price;
}
add_filter( 'woocommerce_cart_item_subtotal', 'display_discounted_price', 10, 2 );
function display_discounted_price( $values, $item ) {
return wc_price( $item[ 'line_total' ] ).'<br>incl. shipping';
}
此外 WC()->customer->get_shipping_country();
仅适用于 log gin 客户(我认为)...
希望对您有所帮助。
BUT For shipping additional costs, I think that you are not using the right hooks…