我已经尝试过编辑woothemes网站上的以下代码,以隐藏运费方法:
// woocommerce_package_rates is a 2.1+ hook
add_filter( 'woocommerce_package_rates', 'hide_shipping_when_free_is_available', 10, 2 );
// Hide shipping rates when free shipping is available
// @param array $rates Array of rates found for the package
// @param array $package The package array/object being shipped
// @return array of modified rates
//
function hide_shipping_when_free_is_available( $rates, $package ) {
// Only modify rates if free_shipping is present
if ( isset( $rates['free_shipping'] ) ) {
// To unset a single rate/method, do the following. This example unsets flat_rate shipping
unset( $rates['flat_rate'] );
// To unset all methods except for free_shipping, do the following
$free_shipping = $rates['free_shipping'];
$rates = array();
$rates['free_shipping'] = $free_shipping;
}
return $rates;
}
我编写了从'free_shipping'到'ups'的代码,我认为这是我需要做的全部但是没有任何结果。
我正在使用Mike Jolley的Table Rate Shipping 2.9.0 Woocommerce 2.4.6 和UPS运输方法3.1.1由woothemes
任何帮助都将不胜感激。
我想要完成的是: 并非所有产品都有尺寸。对于有尺寸并且可以通过UPS结账的产品,我希望他们只能使用UPS结账。 如果有混合推车或没有尺寸的产品,我希望它使用Table Rate运费。
我特别不想要的是同时显示UPS和桌面费率。
答案 0 :(得分:2)
使用该代码段的主要问题是UPS和Table Rate Shipping有多种费率....因此有多种费率ID。因此,您无法使用简单isset($rates['ups'])
有效地测试特定费率的存在,也无法使用unset($rates['table_rate']);
请查看我var_dump
的样本运费率。我正在使用USPS,因为这就是我手边的东西,但我希望它与UPS非常相似。
据我所知,为了实现您的目标,我们需要测试数组键中是否存在“ups”或“table_rate”字符串的键。幸运的是,使用strpos
非常容易。
我对USPS进行了测试,似乎有效。我使用WooCommerce工具将网站设置为Shipping Debug模式。否则,WooCommerce将费率存储在瞬态一小时。 (请参阅:您网站上的admin.php?page=wc-status&tab=tools
)
这是我的最终代码:
// remove any table_rate rates if UPS rates are present
add_filter( 'woocommerce_package_rates', 'hide_table_rates_when_ups_available', 10, 2 );
function hide_table_rates_when_ups_available( $rates, $package ) {
// Only modify rates if ups is present
if ( is_ups_available( $rates ) ) {
foreach ( $rates as $key => $rate ){
$pos = strpos( $key, 'table_rate' );
if( false !== $pos ){
unset( $rates[$key] );
}
}
}
return $rates;
}
// loops through the rates looking for any UPS rates
function is_ups_available( $rates ){
$is_available = false;
foreach ( $rates as $key => $rate ){
$pos = strpos( $key, 'ups' );
if( false !== $pos ){
$is_available = true;
break;
}
}
return $is_available;
}