我试图隐藏除一个基于shipping类的shipping方法之外的所有方法,当选择了一个属于特定类的产品时,实际上是强制使用fedex过夜方法。
我从this code开始,修改如下:
add_filter( 'woocommerce_available_shipping_methods', 'hide_shipping_based_on_class' , 10, 1 );
function check_cart_for_share() {
// load the contents of the cart into an array.
global $woocommerce;
$cart = $woocommerce->cart->cart_contents;
$found = false;
// loop through the array looking for the tag you set. Switch to true if the tag is found.
foreach ($cart as $array_item) {
$term_list = wp_get_post_terms( $array_item['product_id'], 'product_shipping_class', array( "fields" => "names" ) );
if (in_array("Frozen",$term_list)) {
$found = true;
break;
}
}
return $found;
}
function hide_shipping_based_on_class( $available_methods ) {
// use the function above to check the cart for the tag.
if ( check_cart_for_share() ) {
// remove the rate you want
unset( $available_methods['canada_post,purolator,fedex:FEDEX_GROUND,fedex:GOUND_HOME_DELIVERY'] );
}
// return the available methods without the one you unset.
return $available_methods;
}
不过,它似乎没有隐藏任何运输方法。不知道我错过了什么…
这是一个多站点的安装,我正在加拿大的http://stjeans.harbourcitydevelopment.com测试它。
我正在运行表运费模块,以及联邦快递,普罗拉托和加拿大邮政模块。
最佳答案
我也有同样的问题,修改你的代码有帮助。一个问题是“woomerce_available_shipping_methods”过滤器在woomerce 2.1中被弃用。所以你必须使用新的一个:“Woomerce_套餐价格”。类似的任务也有WooCommerce tutorial。
所以,我更改了filter hook,当条件为true时,我迭代所有的运输方法/费率,找到要显示给客户的方法/费率,从中创建新的数组并返回这个数组(只有一个项)。
我认为您的问题(除了不推荐的钩子)主要是在错误的unset($available_methods[…])行中。它不能那样工作。
这是我的代码:
add_filter( 'woocommerce_package_rates', 'hide_shipping_based_on_class' , 10, 2 );
function hide_shipping_based_on_class( $available_methods ) {
if ( check_cart_for_share() ) {
foreach($available_methods as $key=>$method) {
if( strpos($key,'YOUR_METHOD_KEY') !== FALSE ) {
$new_rates = array();
$new_rates[$key] = $method;
return $new_rates;
}
}
}
return $available_methods;
}
警告!我发现Woomerce的套餐价格挂钩并不是每次都会被触发,而是只有在您更改购物车中的商品或商品数量时才会触发。或者对我来说是这样。也许这些可用的费率是缓存为购物车的内容。
关于php - Woocommerce,隐藏基于运输类的运输方式,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23701467/