用免费送货方式取代付费送货方式WooCommerce

时间:2013-09-17 作者:BFTrick

如果我有一家提供统一运费的商店$10 订单金额超过100美元,客户订单金额超过$100 对他们来说,两者都要看没有多大意义free shippingflat rate shipping 在签出页面上。为什么用户会选择flat rate shipping?

如何使用过滤器检测free shipping 如果可用,请过滤flat rate shipping 标签上写着flat rate shipping (free), 然后禁用free shipping 方法

最终结果是,如果用户的订单少于$100 他们看到了flat rate shipping $10 如果他们下单$100 他们看到了flat rate shipping (free!).

2 个回复
SO网友:kaiser

我对WooCommerce一无所知,但从他们的Action and Filter Reference, 我可以看到*shipping*.

其中大多数似乎位于名为form-shipping.php:

模板挂钩:操作woocommerce_before_checkout_shipping_form
  • woocommerce_after_checkout_shipping_form
  • woocommerce_before_shipping_calculator
  • woocommerce_after_shipping_calculator
  • woocommerce_cart_totals_after_shipping
  • woocommerce_checkout_shipping
  • woocommerce_review_order_before_shipping
  • woocommerce_review_order_after_shippingwoocommerce_cart_shipping_method_full_label
  • woocommerce_shiptobilling_default
  • woocommerce_shipping_calculator_enable_city
  • woocommerce_shipping_calculator_enable_postcodewoocommerce_calculated_shipping
  • woocommerce_load_shipping_methods
  • woocommerce_shipping_init
  • woocommerce_shipping_method_chosenwoocommerce_available_shipping_methods
  • woocommerce_cart_needs_shipping
  • woocommerce_cart_ready_to_calc_shipping
  • woocommerce_cart_shipping_packages
  • woocommerce_countries_shipping_to_prefix
  • woocommerce_order_amount_shipping
  • woocommerce_order_amount_shipping_tax
  • woocommerce_order_shipping_method
  • woocommerce_order_shipping_to_display
  • woocommerce_shipping_.$this->id._is_available
  • woocommerce_shipping_calculator_enable_city
  • woocommerce_shipping_calculator_enable_postcode
  • woocommerce_shipping_chosen_method
  • woocommerce_shipping_fields
  • woocommerce_shipping_method_supports
  • woocommerce_shipping_method_title
  • woocommerce_shipping_methods

    无论如何,在找到正确的过滤器之前,您必须为所有过滤器编写大量的测试回调。WooCommerce文档似乎除了这个无休止的文件名列表(没有文件夹)之外什么都没有。因此,如果你或其他人想处理这件事,祝你好运。

  • SO网友:webaware

    您可以使用woocommerce_available_shipping_methods 筛选以执行此操作。注意:如果你有基于角色的发货插件,你可能会发现它在某些情况下会删除免费发货选项;如果购物者有免费送货的优惠券,此代码会将其放回原处。

    /**
    * if Free Shipping method is available, reduce to just Free Shipping
    * @param array $available_methods
    * @return array
    */
    add_filter(\'woocommerce_available_shipping_methods\', function($available_methods) {
        global $woocommerce;
    
        // check for coupon with Free Shipping
        if (wpse_114581_has_coupon_free_shipping()) {
            // ensure that Free Shipping is in the list of available methods (again -- Role Based Methods may strip Free Shipping for Guests)
            if (!isset($available_methods[\'free_shipping\'])) {
                $available_methods[\'free_shipping\'] = new WC_Shipping_Rate(\'free_shipping\', \'Free Shipping\', 0, array(), \'\');
            }
        }
    
        // if both Free Shipping and another method, reduce to just free shipping
        if (isset($available_methods[\'free_shipping\']) && count($available_methods) > 1) {
            $available_methods = array(\'free_shipping\' => $available_methods[\'free_shipping\']);
    
            // change title on Free Shipping method
            $available_methods[\'free_shipping\']->method_title = \'flat rate shipping (free!)\';
        }
    
        return $available_methods;
    });
    
    /**
    * check for coupon with free shipping
    * @return bool
    */
    function wpse_114581_has_coupon_free_shipping() {
        global $woocommerce;
    
        foreach ($woocommerce->cart->applied_coupons as $code) {
            $coupon = new WC_Coupon($code);
            if ($coupon->is_valid() === true) {
                if ($coupon->enable_free_shipping()) {
                    return true;
                }
            }
        }
    
        return false;
    }
    

    结束

    相关推荐

    注意:未定义索引:SUPPRESS_FILTERS

    我正在做一个主题的除虫工作,我希望有人能帮助我。我使用JustinTadlock创建的这个函数在博客页面上显示自定义帖子类型,并且将wp debug设置为true,我会收到一个通知:未定义索引:suppress\\u filters消息。代码如下:// Custom Post Type for the public blog posts to show on Index or blog page add_filter( \'pre_get_posts\', \'my_get_posts\' );&