在 WooCommerce 中禁用具有特定单词并基于运费 class 的送货方式
Disable shipping methods having a specific word and based on a shipping class in WooCommerce
我使用了 Business Bloomer snippet 并对其进行了一些微调,以根据购物车中 class 件商品的运送情况取消某些运送方式的设置。
它适用于我测试过的 4 种送货方式,但为了在我的网站上完全正常工作,我必须手动列出所有送货方式值,并且我有很多(86 需要取消设置 if
和 else
中的 60。)
因此,我想编辑截图,这样我就可以一次取消所有包含相同术语的运输方式,而不是单独查找每个值,但我真的不知道该怎么做。
我有印刷品待售,所以我为包括印刷品在内的订单设置了一些运输方式,为没有订单的订单设置了一些运输方式。因此,我所有的印刷品运输方式的值都以“_print”结尾,而其他方式的值以“_classique”结尾,正如您在下面的代码中看到的那样。
我的目标是禁用所有以“_classique”结尾的送货方式,当购物车中的产品带有“打印”送货 class 时,反之亦然。
到目前为止,我的代码如下所示:
add_filter( 'woocommerce_package_rates', 'businessbloomer_hide_regular_shipping_method', 10, 2 );
function businessbloomer_hide_regular_shipping_method( $rates, $package ) {
$shipping_class_target = 35; // shipping class ID
$in_cart = false;
foreach( WC()->cart->get_cart_contents() as $key => $values ) {
if( $values[ 'data' ]->get_shipping_class_id() == $shipping_class_target ) {
$in_cart = true;
break;
}
}
if( $in_cart ) { // shipping method with value
unset( $rates['wbs:2:d6f790a0_colissimo_sans_signature_classique'] );
unset( $rates['wbs:2:d748dcd4_lettre_suivie_classique'] );
unset( $rates['wbs:2:f1058bc8_colissimo_avec_signature_classique'] );
}
else{
unset( $rates['wbs:2:1cdf4913_colissimo_sans_signature_print'] );
unset( $rates['wbs:2:fghla482_lettre_suivie_print'] );
unset( $rates['wbs:2:g27a1f56_colissimo_avec_signature_print'] );
}
return $rates;
}
任何有关如何实现此目的的帮助将不胜感激。
感谢所有愿意花时间阅读本文的人!
已更新
使用PHP strpos()
将允许您检查某个单词是否包含在字符串中。然后您需要对代码进行一些更改以使其工作:
add_filter( 'woocommerce_package_rates', 'show_hide_shipping_methods', 10, 2 );
function show_hide_shipping_methods( $rates, $package ) {
$shipping_class_id = 35; // Targeted shipping class ID
$found = false;
// Loop through cart items for the current package
foreach ( $package['contents'] as $cart_item ) {
if( $cart_item['data']->get_shipping_class_id() == $shipping_class_id ) {
$found = true;
break;
}
}
// Loop through shipping rates
foreach ( $rates as $rate_key => $rate ) {
if ( $found && strpos($rate_key, '_classique') !== false ) {
unset($rates[$rate_key]);
}
elseif (! $found && strpos($rate_key, '_print') !== false ) {
unset($rates[$rate_key]);
}
}
return $rates;
}
代码进入活动子主题(或活动主题)的 functions.php 文件。它应该有效。
Clearing shipping caches:
- You will need to empty your cart, to clear cached shipping data
- Or In shipping settings, you can disable / save any shipping method, then enable back / save.
相关:
- How can I check if a word is contained in another string using PHP?
我使用了 Business Bloomer snippet 并对其进行了一些微调,以根据购物车中 class 件商品的运送情况取消某些运送方式的设置。
它适用于我测试过的 4 种送货方式,但为了在我的网站上完全正常工作,我必须手动列出所有送货方式值,并且我有很多(86 需要取消设置 if
和 else
中的 60。)
因此,我想编辑截图,这样我就可以一次取消所有包含相同术语的运输方式,而不是单独查找每个值,但我真的不知道该怎么做。
我有印刷品待售,所以我为包括印刷品在内的订单设置了一些运输方式,为没有订单的订单设置了一些运输方式。因此,我所有的印刷品运输方式的值都以“_print”结尾,而其他方式的值以“_classique”结尾,正如您在下面的代码中看到的那样。
我的目标是禁用所有以“_classique”结尾的送货方式,当购物车中的产品带有“打印”送货 class 时,反之亦然。
到目前为止,我的代码如下所示:
add_filter( 'woocommerce_package_rates', 'businessbloomer_hide_regular_shipping_method', 10, 2 );
function businessbloomer_hide_regular_shipping_method( $rates, $package ) {
$shipping_class_target = 35; // shipping class ID
$in_cart = false;
foreach( WC()->cart->get_cart_contents() as $key => $values ) {
if( $values[ 'data' ]->get_shipping_class_id() == $shipping_class_target ) {
$in_cart = true;
break;
}
}
if( $in_cart ) { // shipping method with value
unset( $rates['wbs:2:d6f790a0_colissimo_sans_signature_classique'] );
unset( $rates['wbs:2:d748dcd4_lettre_suivie_classique'] );
unset( $rates['wbs:2:f1058bc8_colissimo_avec_signature_classique'] );
}
else{
unset( $rates['wbs:2:1cdf4913_colissimo_sans_signature_print'] );
unset( $rates['wbs:2:fghla482_lettre_suivie_print'] );
unset( $rates['wbs:2:g27a1f56_colissimo_avec_signature_print'] );
}
return $rates;
}
任何有关如何实现此目的的帮助将不胜感激。 感谢所有愿意花时间阅读本文的人!
已更新
使用PHP strpos()
将允许您检查某个单词是否包含在字符串中。然后您需要对代码进行一些更改以使其工作:
add_filter( 'woocommerce_package_rates', 'show_hide_shipping_methods', 10, 2 );
function show_hide_shipping_methods( $rates, $package ) {
$shipping_class_id = 35; // Targeted shipping class ID
$found = false;
// Loop through cart items for the current package
foreach ( $package['contents'] as $cart_item ) {
if( $cart_item['data']->get_shipping_class_id() == $shipping_class_id ) {
$found = true;
break;
}
}
// Loop through shipping rates
foreach ( $rates as $rate_key => $rate ) {
if ( $found && strpos($rate_key, '_classique') !== false ) {
unset($rates[$rate_key]);
}
elseif (! $found && strpos($rate_key, '_print') !== false ) {
unset($rates[$rate_key]);
}
}
return $rates;
}
代码进入活动子主题(或活动主题)的 functions.php 文件。它应该有效。
Clearing shipping caches:
- You will need to empty your cart, to clear cached shipping data
- Or In shipping settings, you can disable / save any shipping method, then enable back / save.
相关:
- How can I check if a word is contained in another string using PHP?