#php #wordpress #woocommerce #cart #shipping-method
#php #wordpress #woocommerce #Корзина #способ доставки
Вопрос:
В Woocommerce я хочу предложить бесплатную доставку в зависимости от количества товаров в корзине. Во-первых, я начал просматривать доступные плагины и не могу найти какое-либо простое решение, основанное на количестве.
Все, что я хочу сделать, это: купить 2 любых товара и получить бесплатную доставку.
Пытаясь разобраться, я попробовал следующий код:
function free_ship( $is_available ) {
$count = 0;
global $woocommerce;
$items = $woocommerce->cart->get_cart();
foreach($items as $item) {
$count ;
}
echo $count;
if ( $count == 1 ) {
echo 'add one more for free shipping';
return $is_available;
} elseif ($count > 1) {
echo 'you get free shipping';
return false;
} else {
echo 'nothing in your cart';
return $is_available;
}
}
add_filter( 'woocommerce_shipping_free_shipping_is_available', 'free_ship' );
Но это зависает при добавлении товаров в корзину. Это также приводит к сбоям при удалении товаров из корзины. Я хотел бы разобраться с этим в PHP, чтобы я мог дополнительно добавлять более уникальные условия, если они появятся в будущем.
Есть какие-либо предложения?
Ответ №1:
В вашем коде есть некоторые ошибки, такие как пропущенные аргументы, сложности и устаревшие элементы… Попробуйте вместо этого следующее:
add_filter( 'woocommerce_shipping_free_shipping_is_available', 'free_shipping_for_x_cart_items', 10, 3 );
function free_shipping_for_x_cart_items( $is_available, $package, $shipping_method ) {
$item_count = WC()->cart->get_cart_contents_count();
if ( $item_count == 1 ) {
$notice = __("Add one more for free shipping");
$is_available = false;
} elseif ($item_count > 1) {
$notice = __("You get free shipping");
$is_available = true;
}
if ( isset($notice) ) {
wc_add_notice( $notice, 'notice' );
}
return $is_available;
}
Этот код входит function.php файл вашей активной дочерней темы (или active theme). Протестировано и работает.
WC_Cart
Метод get_cart_contents_count()
позволяет получить количество всех товаров (включая количество).
Чтобы получить количество различных товаров из корзины (без учета количества), замените строку:
$item_count = WC()->cart->get_cart_contents_count();
с помощью этого:
$item_count = sizeof($package['contents']);
Комментарии:
1. Большое спасибо за ваш подробный ответ! Ваше решение в его нынешнем виде творит чудеса и было отмечено как ответ. Я новичок в php, и на данном этапе я пытаюсь справиться. Спасибо, что помогли мне немного узнать об интеграции php и woocommerce. Я все еще не понимаю, почему целочисленные аргументы передаются в add_filter.
2. Протестировано и больше не работает