php WooCommerce 2.6 -达到特定金额触发免费送货时隐藏付费送货

kwvwclae  于 2023-01-12  发布在  PHP
关注(0)|答案(3)|浏览(136)

我最近更新到WooCommerce 2.6在我的商店,他们已经更新了他们的航运系统。之前,我用这个来隐藏支付航运选项时,达到特定的订单价值,并触发免费送货:

/**
 * 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;
}

虽然这已经不起作用了。我需要一个新的修复,我不是真的进入编码。
有人能解决这个问题吗?
上述解决方案来自此站点:
Hide other shipping methods when FREE SHIPPING is available
我猜自从他们更新了运输方式后,一些参数发生了变化。
我希望有人知道怎么解决这个问题。

ghhkc1vu

ghhkc1vu1#

请尝试用下面的代码段替换现有代码段。此代码段的详细信息在this article中描述。如果可以改进,请告诉我。

add_filter('woocommerce_package_rates', 'xa_hide_shipping_rates_when_free_is_available', 10, 2);

function xa_hide_shipping_rates_when_free_is_available($rates, $package)
{
    global $woocommerce;
    $version = "2.6";
    if (version_compare($woocommerce->version, $version, ">=")) {
        foreach($rates as $key => $value) {
            $key_part = explode(":", $key);
            $method_title = $key_part[0];
            if ('free_shipping' == $method_title) {
                $free_shipping = $rates[$key];
                // Unset all rates.
                $rates = array();
                // Restore free shipping rate.
                $rates[$key] = $free_shipping;
                return $rates;
            }
        }
    }
    else {
        if (isset($rates['free_shipping'])) {
          // Below code is for unsetting single shipping method/option.
            // unset($rates['flat_rate']);
            $free_shipping = $rates['free_shipping'];
            // Unset all rates.
            $rates = array();
            // Restore free shipping rate.
            $rates['free_shipping'] = $free_shipping;
        }
    }

    return $rates;
}
wooyq4lh

wooyq4lh2#

如果您已经删除了旧的送货方式(送货方式必须使用新的送货区设置),您可以使用以下代码片段来删除免费送货时的所有其他送货方式。(WooCommerce 2.6+):

/**
   * Hide shipping rates when free shipping is available.
   * Updated to support WooCommerce 2.6 Shipping Zones.
   *
   * @param array $rates Array of rates found for the package.
   * @return array
   */
  function my_hide_shipping_when_free_is_available( $rates ) {
    $free = array();
    foreach ( $rates as $rate_id => $rate ) {
      if ( 'free_shipping' === $rate->method_id ) {
        $free[ $rate_id ] = $rate;
        break;
      }
    }
    return ! empty( $free ) ? $free : $rates;
  }
  add_filter( 'woocommerce_package_rates', 'my_hide_shipping_when_free_is_available', 100 );

updated docs

x4shl7ld

x4shl7ld3#

好了,下面的代码将允许本地拾取与免费送货:

// ##### WOOCOMMERCE - HIDE OTHER SHIPPING METHODS WHEN FREE SHIPPING IS AVAILABLE #####
add_filter('woocommerce_package_rates', 'hide_shipping_when_free_is_available', 10, 2);
function hide_shipping_when_free_is_available($rates, $package) {
    $free_yn = 0;
    $pickup_yn = 0;
    foreach($rates as $key => $value) {
        $key_part = explode(":", $key);
        $method_title = $key_part[0];
        if ('free_shipping' == $method_title) {
            // check if free shipping rate exists
            $free_yn = 1;
            $free_shipping = $rates[$key];
            $free_key = $key;
        }
        if ('local_pickup' == $method_title) {
            // check if local pickup rate exists
            $pickup_yn = 1;
            $local_pickup = $rates[$key];
            $pickup_key = $key;
        }
    }
    if ($free_yn == 1) {
        // Unset all rates.
        $rates = array();
        // Restore free shipping rate.
        $rates[$free_key] = $free_shipping;
        if ($pickup_yn == 1) {
            // Restore local pickup rate.
            $rates[$pickup_key] = $local_pickup;
        }
        return $rates;
    }
    return $rates;
}

相关问题