首先,我要感谢您花时间阅读问题。代码通常会引用荷兰语,请告诉我是否需要翻译才能理解代码。
情况: 如果满足某些条件,我已经编写了一个自定义功能来取消设置某些运输类别,以确保只有一个选项可供客户看到。
以下是对条件的描述以及我想要完成的事情:
现在我已经编写了代码来实现这一目标。它半成品。我只介绍了一个错误,如果您在结帐时选择其他送货国家(荷兰除外),结帐将会显示为灰色,您将无法完成订单。
我一直在调试函数以查看它出错的地方并得出结论,即使没有任何代码行,add_filter部分也会出错。一旦在我的主题的functions.php中引入这一点,就无法完成除荷兰以外的其他国家的结账(它甚至可以为某些用户打破网站)。
现在,下面的一些代码示例是我使用的过滤器:
add_filter( 'woocommerce_package_rates', 'unset_shipping_when_free_is_available_in_zone', 100, 2 );
正在调用的实际函数:
function unset_shipping_when_free_is_available_in_zone( $rates, $package ) {
global $woocommerce;
$shipping_class_target = briefpost;
$shipping_class_id = 58;
$shipping_class_package_id = 47;
$free_insurance = 2134;
$insurance_found = false;
$no_package = true;
$number_of_briefpost = 0;
foreach( WC()->cart->get_cart() as $cart_item_key => $values ) {
$_product = $values['data'];
$terms = get_the_terms($_product->get_id(), $shipping_class_target);
$shipping_class = $values['data']->get_shipping_class_id();
if ($shipping_class === $shipping_class_id) {
$rates['flat_rate:4']->label = 'Mailbox';
$number_of_briefpost += $values['quantity'];
} else if($shipping_class === $shipping_class_package_id) {
$rates['flat_rate:4']->label = 'Parcel';
$no_package = false;
} else if($_product->get_id() == $free_insurance) {
$insurance_found = true;
$prod_unique_id = WC()->cart->generate_cart_id( $_product->get_id() );
}
}
if ($number_of_briefpost > 1 && $no_package) {
$rates['flat_rate:4']->cost = $rates['flat_rate:4']->cost + 2.30;
$rates['flat_rate:4']->label = 'Parcel';
}
if (isset( $rates['free_shipping:13'] ) ) {
unset( $rates['flat_rate:4'] );
if( !$insurance_found ) {
WC()->cart->add_to_cart($free_insurance, 1);
}
}
if (isset( $rates['flat_rate:4'])) {
if($insurance_found) {
unset( WC()->cart->cart_contents[$prod_unique_id] );
}
}
return $rates;
}
非常感谢所有帮助!
编辑:我也打开了有关符合我确切需求的付费解决方案的建议。然而,到目前为止,在我的搜索中,我没有找到。