根据 WooCommerce 中的产品或类别隐藏特定的运输选项
Hide specific shipping options based on products or categories in WooCommerce
我的 WooCommerce 网站使用 3 种不同的运输类型。
- 英国皇家邮政签收(7 天)
- 保证第二天
- 已记录发货
某些产品只能使用选项 1 运送。将此产品添加到购物车后,我创建的运费 class 有助于在购物车中显示选项 1,但其他两个选项仍然可见(客户不得为此产品选择这些选项)。通过使用 jQuery 我能够隐藏其他两个选项,因为选项 1 是默认选择。 (所以根据这个很容易隐藏另外两个)。
我遇到的问题是 2 个隐藏选项仍然出现在结帐页面上,我不确定为什么。
这是我在购物车中选择第一个选项时用来隐藏其他两个选项的代码:
jQuery(document.body).ready(function() {
if(jQuery('#shipping_method_0_ced_pps').val() == 'ced_pps')
jQuery('ul#shipping_method li:nth-child(2)').hide();
jQuery('ul#shipping_method li:nth-child(3)').hide();
});
奇怪的是,如果我测试结帐页面上是否存在一个值,我可以触发警报,但是当我使用上面的代码时,它根本不起作用。
有人可以提供一些帮助或替代方法吗?
我看过这里, 是我在不使用 jQuery 的情况下最接近的解决方案。此解决方案的问题是我需要将产品 ID 手动输入到 functions.php 文件中。当有超过 100 种产品时,这并不理想。
已更新 无需 jQuery:
有多种方法可以做到
1) 如果您的产品很少,您可以使用以下代码,您将在其中定义:
- 一组产品 ID
- 要删除的送货方式实例 ID
代码:
add_filter( 'woocommerce_package_rates', 'specific_products_shipping_methods', 10, 2 );
function specific_products_shipping_methods( $rates, $package ) {
// HERE set the product IDs in the array
$product_ids = array( 113, 115, 126 );
// HERE set the shipping methods to be removed (like "fat_rate:5")
$method_instances_ids = array('2846', '2851');
$found = false;
// Loop through cart items checking for defined product IDs
foreach( $package['contents'] as $cart_item ) {
if ( in_array( $cart_item['product_id'], $product_ids ) ){
$found = true;
break;
}
}
if ( ! $found ) return $rates; // If not found we exit
// Loop through your active shipping methods
foreach( $rates as $rate_id => $rate ) {
// Remove all other shipping methods other than your defined shipping method
if ( in_array( $rate_id, $method_instances_ids ) ){
unset( $rates[$rate_id] );
}
}
return $rates;
}
代码进入您的活动子主题(或活动主题)的 function.php 文件。测试和工作。
2) 如果您有一堆产品,最好通过产品类别(或产品标签)来定位这些产品…您可以批量分配它。
在代码中,您将定义:
- 产品类别(或分类为
product_tag
的产品标签)
- 要删除的送货方式实例 ID
代码:
add_filter( 'woocommerce_package_rates', 'specific_products_shipping_methods', 10, 2 );
function specific_products_shipping_methods( $rates, $package ) {
// HERE set the product category in the array (ID, slug or name)
$terms = array( 'my-category' );
$taxonomy = 'product_cat';
// HERE set the shipping methods to be removed (like "fat_rate:5")
$method_instances_ids = array('2846', '2851');
$found = false;
// Loop through cart items checking for defined product IDs
foreach( $package['contents'] as $cart_item ) {
if ( has_term( $terms, $taxonomy, $cart_item['product_id'] ) ){
$found = true;
break;
}
}
if ( ! $found ) return $rates; // If not found we exit
// Loop through your active shipping methods
foreach( $rates as $rate_id => $rate ) {
// Remove all other shipping methods other than your defined shipping method
if ( in_array( $rate_id, $method_instances_ids ) ){
unset( $rates[$rate_id] );
}
}
return $rates;
}
代码进入您的活动子主题(或活动主题)的 function.php 文件。测试和工作。
To make it work for Product Tags:
You will simply replace the taxonomy 'product_cat'
by 'product_tag'
3) 如果您有一堆产品,您还可以创建一个运费class并批量分配它到您的产品。您需要在相关的运输方式中为其设置价格...
You should need to refresh the shipping caches:
1) First this code is already saved on your function.php file and empty your cart…
2) In Shipping settings, enter in a Shipping Zone and disable a Shipping Method and "save". Then re-enable that Shipping Method and "save". You are done.
我的 WooCommerce 网站使用 3 种不同的运输类型。
- 英国皇家邮政签收(7 天)
- 保证第二天
- 已记录发货
某些产品只能使用选项 1 运送。将此产品添加到购物车后,我创建的运费 class 有助于在购物车中显示选项 1,但其他两个选项仍然可见(客户不得为此产品选择这些选项)。通过使用 jQuery 我能够隐藏其他两个选项,因为选项 1 是默认选择。 (所以根据这个很容易隐藏另外两个)。
我遇到的问题是 2 个隐藏选项仍然出现在结帐页面上,我不确定为什么。
这是我在购物车中选择第一个选项时用来隐藏其他两个选项的代码:
jQuery(document.body).ready(function() {
if(jQuery('#shipping_method_0_ced_pps').val() == 'ced_pps')
jQuery('ul#shipping_method li:nth-child(2)').hide();
jQuery('ul#shipping_method li:nth-child(3)').hide();
});
奇怪的是,如果我测试结帐页面上是否存在一个值,我可以触发警报,但是当我使用上面的代码时,它根本不起作用。
有人可以提供一些帮助或替代方法吗?
我看过这里,
已更新 无需 jQuery:
有多种方法可以做到1) 如果您的产品很少,您可以使用以下代码,您将在其中定义:
- 一组产品 ID
- 要删除的送货方式实例 ID
代码:
add_filter( 'woocommerce_package_rates', 'specific_products_shipping_methods', 10, 2 );
function specific_products_shipping_methods( $rates, $package ) {
// HERE set the product IDs in the array
$product_ids = array( 113, 115, 126 );
// HERE set the shipping methods to be removed (like "fat_rate:5")
$method_instances_ids = array('2846', '2851');
$found = false;
// Loop through cart items checking for defined product IDs
foreach( $package['contents'] as $cart_item ) {
if ( in_array( $cart_item['product_id'], $product_ids ) ){
$found = true;
break;
}
}
if ( ! $found ) return $rates; // If not found we exit
// Loop through your active shipping methods
foreach( $rates as $rate_id => $rate ) {
// Remove all other shipping methods other than your defined shipping method
if ( in_array( $rate_id, $method_instances_ids ) ){
unset( $rates[$rate_id] );
}
}
return $rates;
}
代码进入您的活动子主题(或活动主题)的 function.php 文件。测试和工作。
2) 如果您有一堆产品,最好通过产品类别(或产品标签)来定位这些产品…您可以批量分配它。
在代码中,您将定义:
- 产品类别(或分类为
product_tag
的产品标签) - 要删除的送货方式实例 ID
代码:
add_filter( 'woocommerce_package_rates', 'specific_products_shipping_methods', 10, 2 );
function specific_products_shipping_methods( $rates, $package ) {
// HERE set the product category in the array (ID, slug or name)
$terms = array( 'my-category' );
$taxonomy = 'product_cat';
// HERE set the shipping methods to be removed (like "fat_rate:5")
$method_instances_ids = array('2846', '2851');
$found = false;
// Loop through cart items checking for defined product IDs
foreach( $package['contents'] as $cart_item ) {
if ( has_term( $terms, $taxonomy, $cart_item['product_id'] ) ){
$found = true;
break;
}
}
if ( ! $found ) return $rates; // If not found we exit
// Loop through your active shipping methods
foreach( $rates as $rate_id => $rate ) {
// Remove all other shipping methods other than your defined shipping method
if ( in_array( $rate_id, $method_instances_ids ) ){
unset( $rates[$rate_id] );
}
}
return $rates;
}
代码进入您的活动子主题(或活动主题)的 function.php 文件。测试和工作。
To make it work for Product Tags:
You will simply replace the taxonomy'product_cat'
by'product_tag'
3) 如果您有一堆产品,您还可以创建一个运费class并批量分配它到您的产品。您需要在相关的运输方式中为其设置价格...
You should need to refresh the shipping caches:
1) First this code is already saved on your function.php file and empty your cart…
2) In Shipping settings, enter in a Shipping Zone and disable a Shipping Method and "save". Then re-enable that Shipping Method and "save". You are done.