我在 woocommerce 中使用 UPS 扩展。我需要绕过 UPS 计算器,为某些物品提供免费送货服务。执行此操作的一种好方法似乎是将项目标记为“虚拟”,但随后该项目不需要运输。我需要为这个项目要求运输。我已经能够自定义结帐页面并强制运输字段显示在虚拟物品上,但是它们不会存储在实际订单中。
任何人都知道我如何创建自定义函数或修改 woocommerce 文件以强制结帐过程要求运送虚拟物品,同时绕过 UPS 计算器?(其他物品需要计算运费)
我在 woocommerce 中使用 UPS 扩展。我需要绕过 UPS 计算器,为某些物品提供免费送货服务。执行此操作的一种好方法似乎是将项目标记为“虚拟”,但随后该项目不需要运输。我需要为这个项目要求运输。我已经能够自定义结帐页面并强制运输字段显示在虚拟物品上,但是它们不会存储在实际订单中。
任何人都知道我如何创建自定义函数或修改 woocommerce 文件以强制结帐过程要求运送虚拟物品,同时绕过 UPS 计算器?(其他物品需要计算运费)
我遇到了同样的问题,插件的作者回复我说不能这样做,必须编写代码才能做到这一点。
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".
我认为可以帮助您使商品“免费”送货的另一种方法(以及我过去使用过的一种方式)是创建可以对产品打折的优惠券(不要将其标记为“虚拟”)它的价格减去运费。
例如,假设您的产品为 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 扩展测试此代码,但可以随意修改和使用它。
我希望这篇文章对你有所帮助!
我也需要这个,并且有一个可行的解决方案:
首先进入您的functions.php
in "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.00
Free Shipping
Calculation Type
Per Class
Save 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 ”的完整付费插件。
或者这个免费插件也可以工作(没有承诺)。