1

我在 woocommerce 中使用 UPS 扩展。我需要绕过 UPS 计算器,为某些物品提供免费送货服务。执行此操作的一种好方法似乎是将项目标记为“虚拟”,但随后该项目不需要运输。我需要为这个项目要求运输。我已经能够自定义结帐页面并强制运输字段显示在虚拟物品上,但是它们不会存储在实际订单中。

任何人都知道我如何创建自定义函数或修改 woocommerce 文件以强制结帐过程要求运送虚拟物品,同时绕过 UPS 计算器?(其他物品需要计算运费)

4

4 回答 4

1

我遇到了同样的问题,插件的作者回复我说不能这样做,必须编写代码才能做到这一点。

于 2013-03-31T15:24:22.583 回答
0

I just ran into this issue, maybe this will help someone out. For all of the products that I wanted free shipping, I made virtual products.

Then I went to Woocommerce > Shipping Options Tab, check the box that says "Collect shipping address even when not required" which is in the "Shipping Destination section".

于 2014-06-12T19:58:55.657 回答
0

我认为可以帮助您使商品“免费”送货的另一种方法(以及我过去使用过的一种方式)是创建可以对产品打折的优惠券(不要将其标记为“虚拟”)它的价格减去运费。

例如,假设您的产品为 100 美元,运费为 10 美元(总计 110 美元),然后您专门为该产品创建优惠券,该优惠券将给予 10 美元折扣,使您的产品和运费总计 100 美元。

我假设您已经知道如何在 woocommerce 中创建优惠券(如果您需要一些关于如何创建优惠券的信息,此页面会有所帮助)。要将优惠券应用于您想要免费送货的特定产品,请转到使用限制-> 产品并指定您想要“免费”(或在本例中为折扣)送货的特定产品。

为了省去用户结账时输入此优惠券代码的麻烦,您可以在functions.php中添加以下代码:

//Check for specific products then discount to adjust for 'free' shipping.

function my_free_shipping(){
//variables.
global $woocommerce;
$coupon_code = 'free-shiping';
$products= array('1', '2'); //products (ID's) to have discounted shipping.

//get the cart contents.
$cart_item = $woocommerce->cart->get_cart();
//loop through the cart items looking for the products in $products.
    foreach ($cart_item as $key => $item){
        //check if the cart items match to any of those in the array.
        if(in_array($item['product_id'], $products)){       
            //apply discount.
            $woocommerce->cart->add_discount(sanitize_text_field($coupon_code));
        }
    }
} 

add_action('init', 'my_free_shipping');   

请注意,我尚未使用 UPS 扩展测试此代码,但可以随意修改和使用它。

我希望这篇文章对你有所帮助!

于 2015-12-15T06:10:53.853 回答
0

我也需要这个,并且有一个可行的解决方案:

首先进入您的functions.phpin "Appearance"->"Editor"->"Theme Functions",并添加以下代码(我强烈建议您首先使用“子主题”,这样您就不会修改主题的functions.php......或者您也可以创建一个自定义插件)。

/* Puts items with "free-shipping" shipping class into a different shipping package. */

    function free_woocommerce_cart_shipping_packages( $packages ) {

        // Reset the packages
        $packages = array();

        // Free items
        $freeshipping_items = array();
        $regular_items      = array();

        // Sort free from regular (replace "free-shipping" below with the shipping class slug you actually use).
        foreach( WC()->cart->get_cart() as $item ) {
            if( $item['data']->needs_shipping() ) {
                if( $item['data']->get_shipping_class() == 'free-shipping' ) {
                    $freeshipping_items[] = $item;
                }
                else {
                    $regular_items[] = $item;
                }
            }
        }

        // Put inside packages:
        if( $freeshipping_items ) {
            $packages[] = array(
                'ship_via'        => array( 'flat_rate' ),
                'contents'        => $freeshipping_items,
                'contents_cost'   => array_sum(wp_list_pluck($freeshipping_items, 'line_total')),
                'applied_coupons' => WC()->cart->applied_coupons,
                'destination'     => array(
                    'country'   => WC()->customer->get_shipping_country(),
                    'state'     => WC()->customer->get_shipping_state(),
                    'postcode'  => WC()->customer->get_shipping_postcode(),
                    'city'      => WC()->customer->get_shipping_city(),
                    'address'   => WC()->customer->get_shipping_address(),
                    'address_2' => WC()->customer->get_shipping_address_2()
                )
            );
        }
        if( $regular_items ) {
            $packages[] = array(
             // 'ship_via'        => array( 'usps' ),
                'contents'        => $regular_items,
                'contents_cost'   => array_sum(wp_list_pluck($regular_items, 'line_total')),
                'applied_coupons' => WC()->cart->applied_coupons,
                'destination'     => array(
                    'country'   => WC()->customer->get_shipping_country(),
                    'state'     => WC()->customer->get_shipping_state(),
                    'postcode'  => WC()->customer->get_shipping_postcode(),
                    'city'      => WC()->customer->get_shipping_city(),
                    'address'   => WC()->customer->get_shipping_address(),
                    'address_2' => WC()->customer->get_shipping_address_2()
                )
            );
        }

        return $packages;
    }

    add_filter('woocommerce_cart_shipping_packages', 'free_woocommerce_cart_shipping_packages');

其次,进入"Products"->"Shipping Classes"并创建一个名为“”的运输类,并Free Shipping带有一个名为“ free-shipping”的 slug(slug 名称是我们将自定义函数绑定到的名称)。然后“ Add New Shipping Class”。

然后在您的"WooCommerce"->"Settings"->"Shipping"->"Flat Rate"启用“ Flat Rate”运输中,并在“ ”部分下,在我们刚刚创建的“”类旁边Shipping Class Costs放置一个“”值。就我而言,我也将“ ”设置为“ ”。然后“ ”。0.00Free ShippingCalculation TypePer ClassSave changes

然后最后在"WooCommerce"->"Settings"->"Shipping"->"Shipping Options"Shipping Methods”部分,确保“ Flat Rate”具有Selection Priority比您使用的任何其他运输方式更高的“”(在该名称的列中),并且它是列表中的最后一个(您可以使用每个选项左侧的菜单图标拖动以重新排序)。“ Save Changes”。

然后编辑您希望免费送货的产品之一,转到“ Product Data"->"Shipping”部分并将运输类别更改为“ Free Shipping”(您创建的新类别)。然后“ Update”该产品保存更改。然后将其添加到您的购物车,并将其他一些定期非免费送货的商品添加到您的购物车中。

测试。

您现在应该看到,免费送货商品有自己的送货“包裹”行(“ Shipping #1”和“ Shipping #2”),与仍应收取运费的商品分开,即使您在购物车中每种商品都有一些。

或者,您也可以尝试名为“ Per Product Shipping ”的完整付费插件。

或者这个免费插件也可以工作(没有承诺)。

于 2015-12-14T23:39:40.647 回答