【问题标题】:Woocommerce Free shipping min amount with currency conversionWoocommerce 免费送货最低金额与货币转换
【发布时间】:2020-11-26 08:27:20
【问题描述】:

Woocommerce 免费送货方式不适用于多种货币。 我定义了欧洲区免费送货的最低订单金额 100。

主要货币设置为 EURO,它工作正常,但随后我切换国家(挪威)自动应用免费送货(因为挪威货币 KR 对 EURO 非常低,免费送货只考虑最小安装数量,而不是货币),它不是根据货币应用。转换器。

add_filter('woocommerce_package_rates', function ($methods, $rates) {
    $currency = get_woocommerce_currency();
    foreach ((array)$methods as &$method) {
        if ($currency != 'USD' && $currency != 'GBP' && $currency != 'CHF') {
            // echo "Hello";
            // print_r($method->get_cost());
            $method->set_cost(round(get_exchanged_currency($currency, $method->get_cost(), true, 'EUR', '', true), 2));
        }
    }
    return $methods;
}, 10, 2);

上面的代码可以很好地计算统一运费。

我想根据用户本地货币转换器实施免费送货(即,如果用户选择挪威国家/地区,则免费送货最低订单价值 = 100 欧元,然后仅当订单价值为 1062.19 Kr 时才适用免费送货)。

如果有人可以帮助我,我将不胜感激。

【问题讨论】:

  • 请在您的问题中添加您用于多币种和货币转换的插件...
  • 我使用了 WPML 插件。下面的代码工作正常pastebin.com/0ZJjXY5E 但免费送货方式不会自动应用。我想隐藏所有送货方式并自动申请免费送货。如果您有解决此问题的任何想法,请告诉我?

标签: php wordpress woocommerce hook-woocommerce shipping-method


【解决方案1】:

由于我真的不知道get_exchanged_currency() 函数是如何工作的,所以我不确定转换量的使用情况,但逻辑在下面的代码中。

使用货币换算以最低金额处理免费送货

  • 您首先需要为您的免费送货方式设置设置最小的
  • 代码将在启用该选项的情况下为应用的优惠券处理免费送货
  • 您将在代码中设置默认货币的最低金额。

如果要处理多种货币作为 IF / ELSE 语句的条件,请改用in_array()

代码:

add_filter('woocommerce_package_rates', 'filter_package_rates', 10, 2 );
function filter_package_rates( $rates, $package ) {
    $currency  = get_woocommerce_currency();
    $free = array();

    foreach ( $rates as $rate_key => $rate ) {
        // For "flat_rate" (or "local_pickup") and NOT for 'USD', 'GBP', 'CHF' currencies
        if ( ! in_array( $currency, array('USD', 'GBP', 'CHF') ) && 'free_shipping' !== $rate->method_id ) {
            $rates[$rate_key]->cost = round( get_exchanged_currency( $currency, $rate->cost, true, 'EUR', '', true ), 2 );
        }
        // For "free_shipping
        elseif ( 'free_shipping' === $rate->method_id ) {
            $cart_total = WC()->cart->subtotal; // (or WC()->cart->get_subtotal() without taxes)
            $min_amount = 100; // Free shipping min amount in EUR currency
            $min_amount = round( get_exchanged_currency( $currency, $min_amount, true, 'EUR', '', true ), 2 ); // Min amount convversion

            $free_shipping    = new \WC_Shipping_Free_Shipping( $rate->instance_id );
            $applied_coupons  = WC()->cart->get_applied_coupons();

            if ( 'either' === $free_shipping->requires && ! empty($applied_coupons) && $cart_total < $min_amount ) {
                foreach ( $applied_coupons as $coupon_code ) {
                    $coupon = new WC_Coupon( $coupon_code );
                    if( $coupon->get_free_shipping() ) {
                        $coupon_free_ship = true;
                        break;
                    }
                }
            }
            // Enable free shipping for a minimal cart amount or a coupon with free shipping option
            if( $cart_total < $min_amount && ! isset($coupon_free_ship) ) {
                unset($rates[$rate_key]);
            } else {
                $free[$rate_key] = $rate;
                break;
            }
        }
    }
    return ! empty( $free ) ? $free : $rates;
}

代码在您的活动子主题(或活动主题)的functions.php 文件中。它应该可以工作。


已启用免费送货选项的应用优惠券:

当订单小计少于所需的最低金额并且应用了免费送货优惠券时,启用免费送货方式隐藏其他送货方式。

刷新运输缓存:

  1. 此代码已保存在您的 functions.php 文件中。
  2. 在运输区域设置中,禁用/保存任何运输方式,然后启用返回/保存。

    您已完成,您可以对其进行测试。

相关:WooCommerce - Hide other shipping methods when FREE SHIPPING is available

【讨论】:

  • @ LoicTheAztec 非常感谢您的帮助。下面的代码工作正常pastebin.com/0ZJjXY5E 但不会自动应用免费送货方式。我想隐藏所有送货方式并自动申请免费送货。
  • @LoicTheAztec 非常感谢。如果可能的话,给我一点提示,以便我可以解决问题并将其交付给客户。
  • @Rigal 抱歉,我已经在店面主题下的最后一个 WooCommerce 版本上再次测试了我的代码,它也适用于免费送货的应用优惠券,所以还有其他问题在你的情况下造成麻烦。它可以是另一个自定义代码、您的主题或插件。
猜你喜欢
  • 2016-11-05
  • 2014-12-22
  • 2021-07-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-01
相关资源
最近更新 更多