У меня есть два способа доставки: стандартная ставка (метод 1) и экспресс-почта с фиксированной ставкой (метод 2). Две категории продуктов, X и Z, могут использовать только метод 1, поэтому я хочу скрыть метод 2 от выбора доставки при оформлении заказа, если в корзине есть какие-либо товары из категории X или Z.
Я искал Stackoverflow и нашелэтот пост Скрыть конкретный способ доставки для определенных продуктов в Woocommerce и попытался применить ответ безуспешно. Код, который я пробовал, с соответствующими изменениями, я считаю, приведен ниже.
function specific_products_shipping_methods( $rates, $package ) {
$product_ids = array( 39 ); // HERE set the product IDs in the array
$method_id = 'Express_Post:5'; // HERE set the shipping method ID
$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 )
unset( $rates[$method_id] );
return $rates;
}
Способ доставки 2 имеет идентификатор: 5, а категория продукта X - идентификатор: 39. Я отключил, сохранил, включил и сохранил способ доставки 2. Когда я добавляю вышеперечисленное как фрагмент кода в php-файл, он либо ломает сайт («Ваш сайт испытывает технические трудности»), либо после ввода адреса доставки я застрял(вращающееся колесо) и поэтому не может попасть в корзину, чтобы проверить, работает ли код.
[Обновление]
Большое спасибо @Kelvin Mariano за ваш ответ,Я пробовал ваш код несколько раз с несколькими вариантами на случай, если у меня что-то не так. Я больше не получаю никаких ошибок, но оба способа доставки отображаются, даже если в корзине нет товара.
Вывод эха для соответствующего метода доставки был следующим:
[flat_rate:5] => WC_Shipping_Rate Object
(
[data:protected] => Array
(`
[id] => flat_rate:5
[method_id] => flat_rate
[instance_id] => 5
[label] => Express Post
Код, который я пробовал, был следующим:
<code> function bz_specific_products_shipping_methods( $rates, $package ) {
$product_ids = array( 39 ); // HERE set the product IDs in the array
//$method_id = 'flat_rate:5'; // HERE set the shipping method ID
$method_id = 'flat_rate:5'; // HERE set the shipping method ID
$found = false;
/*
//please remove this comment to view all shipping methods and their information
`echo "<pre>";
print_r( $rates );
echo "
"; exit (); * /`// Цикл по элементам корзины Проверка определенных идентификаторов товаров foreach ($ package ['contents'] как $ cart_item) {if (in_array ($ cart_item ['product_id'], $ product_ids)) {$ found = true; break;}} if ($ found) {if (isset ($ нормы [$ method_id])) {unset ($ ставок [$ method_id]);}} вернуть $ ставок;} // использовать фильтр, это важно add_filter ('woocommerce_package_rates', 'bz_specific_products_shipping_methods', 10, 2);
Обновление 2
Array
(
[flat_rate:1] => WC_Shipping_Rate Object
(
[data:protected] => Array
(
[id] => flat_rate:1
[method_id] => flat_rate
[instance_id] => 1
[label] => Flat rate Standard
[cost] => 9.00
)
)
[flat_rate:5] => WC_Shipping_Rate Object
(
[data:protected] => Array
(
[id] => flat_rate:5
[method_id] => flat_rate
[instance_id] => 5
[label] => Express Post
[cost] => 11.77