仅对某些项目免费送货-或者,如果项目设置为虚拟,则获得本地提货选项

时间:2013-11-13 作者:Shorty05

我目前正在建立一家woocommerce驱动的商店。

我使用fedex shipping calc.扩展来计算运费。

我想免费运送所有低于200美元的物品。不管购物车的总金额是否超过200美元。意味着您可以添加4或6件物品,如果每件物品的价格低于200美元,则无需考虑购物车中的物品数量。

所以,我所做的是,我将所有(低于200美元)项目设置为“虚拟”项目。这样他们就跳过了联邦快递的运费计算。

问题是,我还想提供本地取货作为一种运输选择。但是,如果客户的购物车中只有虚拟物品,则无法选择该选项。

是否有办法启用本地取货选项?

还是有更聪明的解决方案来实现这个想法?

编辑:

我还尝试了以下几点:

我创建了一个特殊的航运类,名为“免费航运”。

我已经为其中一个价格低于200美元的项目禁用了“虚拟”选项。我在那件商品上加了“特级”免费送货。

然后,我启动了统一费率的运费方法,并将运费设置为0.00

  • 我告诉我,只对我以前生成的类(免费配送)激活固定费率配送选项。

    我将该选项从固定费率重命名为免费送货,以便在结账页面上显示为免费送货

    到目前为止还不错,现在如果我将该项目添加到购物篮中,我会看到两个选项:免费送货(我已重命名的原始统一费率)和“本地提货”选项。

    到目前为止,一切都很好。这很好。。。

    问题是,只要我向购物车中添加另一个价格超过200美元的商品,联邦快递就会生效,并将计算运费,并显示一些联邦快递选项。

    我也看到了本地提货,但这也是问题所在,我也看到了免费送货选项,因为我给的特殊类别的物品仍然在篮子里。

    意味着人们可以选择免费送货,这不是我要找的。只要篮子里有一件价格超过200美元的商品,免费送货就应该取消了。

    我在WPA上发现以下截图

    以下是一些GIST从GitHub问题讨论中收集的片段,另一个答案中由@Ewout链接。我添加了一个var\\u dump(),因此您可以取消注释并检查要删除的内容。

    $available_methods is an array of:
    
    $available_methods as $method_id => $method
    Compare against $method_id if you need more specific checks.
    
    // Hide standard shipping option when free shipping is available
    add_filter( \'woocommerce_available_shipping_methods\',         \'wpse90835_hide_standard_shipping_when_free_is_available\' );
    /**
     *  Hide Standard Shipping option when free shipping is available
     * 
     * @param array $available_methods
     */
    function  wpse90835_hide_standard_shipping_when_free_is_available($available_methods )
    {
    // Developers!: Dump this to see what you can unset
    # var_dump( $available_methods );
    
    // remove standard shipping option
    if ( 
        isset( $available_methods[\'free_shipping\'] ) 
        AND isset( $available_methods[\'flat_rate\'] )
    )
        unset( $available_methods[\'flat_rate\'] );
    
    
    return $available_methods;
    }
    
    有人能告诉我如何使用“如果需要更具体的检查,请与$method\\u id进行比较”

  • 1 个回复
    SO网友:helgatheviking

    我深入挖掘了一下,在摘要中发现WC_Product 同学们,这里有needs_shipping() 方法:

    /**
     * Checks if a product needs shipping.
     *
     * @access public
     * @return bool
     */
    public function needs_shipping() {
        return apply_filters( \'woocommerce_product_needs_shipping\', $this->is_virtual() ? false : true, $this );
    }
    
    而且它是可过滤的,这意味着我们可以忽略我们喜欢的任何产品的运输成本需求。假设您有一个包含slug的shipping类:shipping-class 您可以将具有该类的任何项目设置为不需要发货:

    function wpa_123136_no_shipping( $needs_shipping, $product ){
      if( $product->get_shipping_class() == \'free-shipping\' ){
        $needs_shipping = false;
      }
      return $needs_shipping;
    }
    add_filter(\'woocommerce_product_needs_shipping\',\'wpa_123136_no_shipping\', 10, 2 );
    
    或者,如果您有一个价格点,不想为免费送货类而烦恼:

    function wpa_123136_no_shipping( $needs_shipping, $product ){
      if( $product->get_price() < 200 ){
        $needs_shipping = false;
      }
      return $needs_shipping;
    }
    add_filter(\'woocommerce_product_needs_shipping\',\'wpa_123136_no_shipping\', 10, 2 );
    

    结束

    相关推荐

    Security and Must Use Plugins

    从codex article 必须使用插件:只需将文件上载到mu插件目录即可启用,无需登录我觉得这是一个潜在的安全问题。在站点上运行插件中的任何代码之前,必须通过管理面板激活常规插件。我一直认为这是一个明智的安全预防措施,因为攻击者如果能够以某种方式将文件上载到plugins文件夹,则在运行代码之前,还必须访问和修改数据库。这个mu-plugins 文件夹似乎提供了一种简单的方法来避免这种情况。我知道WordPress开发人员比我更了解安全性,所以我想知道是否有人能解释为什么这不是一个安全漏洞。