当UPS送货方式可用时,我试图隐藏表费率运费

时间:2015-11-10 22:00:12

标签: php wordpress plugins woocommerce ups

我已经尝试过编辑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和桌面费率。

1 个答案:

答案 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;
}