Корзина
Корзина — объект WC()->cart класса WC_Cart. Он хранит позиции в сессии посетителя и пересчитывает итог при каждом изменении. Корзина существует только на страницах сайта: в панели управления и фоновых задачах её нет.
Где писать код
Создайте файл includes/cart.php и подключите его в acme-shop.php.
Чтение корзины
// wp-content/plugins/acme-shop/includes/cart.php
add_action('wp_footer', function () {
if (!WC()->cart || WC()->cart->is_empty()) {
return;
}
printf(
'<p class="acme-cart-line">В корзине товаров: %d на сумму %s</p>',
WC()->cart->get_cart_contents_count(),
wc_price(WC()->cart->get_subtotal())
);
});Хук wp_footer срабатывает в конце каждой страницы сайта. Положите кружку в корзину — внизу любой страницы появится строка «В корзине товаров: 1 на сумму 9,90 €».
Позиции
Метод get_cart() возвращает массив позиций. Ключ массива — строка, уникальная для позиции:
// wp-content/plugins/acme-shop/includes/cart.php
add_action('wp_footer', function () {
if (!WC()->cart) {
return;
}
foreach (WC()->cart->get_cart() as $key => $item) {
$product = $item['data'];
printf(
'<p>%s × %d = %s</p>',
esc_html($product->get_name()),
$item['quantity'],
wc_price($item['line_total'])
);
}
});| Поле позиции | Что в нём |
|---|---|
data | Объект товара WC_Product |
product_id | Идентификатор товара |
variation_id | Идентификатор вариации или 0 |
quantity | Количество |
line_total | Сумма позиции после скидок |
Методы корзины
| Метод | Что делает |
|---|---|
add_to_cart($productId, $qty) | Добавляет товар, возвращает ключ позиции или false |
remove_cart_item($key) | Удаляет позицию |
set_quantity($key, $qty) | Меняет количество |
empty_cart() | Очищает корзину |
get_cart_contents_count() | Число единиц товара |
get_subtotal() | Сумма товаров без доставки |
get_total('edit') | Итог числом |
is_empty() | Пуста ли корзина |
Добавление в коде
Готовая ссылка /?add-to-cart=12 кладёт товар 12 в корзину без кода. Набор из нескольких товаров добавляют сами:
// wp-content/plugins/acme-shop/includes/cart.php
add_action('template_redirect', function () {
if (!isset($_GET['acme_kit'])) {
return;
}
WC()->cart->add_to_cart(12, 2);
WC()->cart->add_to_cart(18, 2);
wp_safe_redirect(wc_get_cart_url());
exit;
});Откройте адрес /?acme_kit=1: в корзину попадут две кружки и две тарелки, и откроется страница корзины. Вариацию добавляют с третьим аргументом — её идентификатором: add_to_cart(15, 1, 87).
Удаление
foreach (WC()->cart->get_cart() as $key => $item) {
if ($item['product_id'] === 18) {
WC()->cart->remove_cart_item($key);
}
}Удаляют по ключу позиции, а не по идентификатору товара: один товар может лежать в корзине несколькими позициями.
Проверка при добавлении
// wp-content/plugins/acme-shop/includes/cart.php
add_filter('woocommerce_add_to_cart_validation', function (bool $passed, int $productId, int $quantity): bool {
if ($quantity > 5) {
wc_add_notice('Не больше пяти штук одного товара за раз.', 'error');
return false;
}
return $passed;
}, 10, 3);Введите на странице товара количество 6 и нажмите «В корзину»: товар не добавится, а вверху страницы появится красное сообщение. Функция wc_add_notice() показывает сообщение покупателю; виды — success, error, notice.
Частая ошибка
К WC()->cart обращаются в хуке панели или в фоновой задаче и получают ошибку «вызов метода у null». Корзина создаётся только для посетителя сайта. Если хук может сработать где угодно, начинайте функцию с проверки if (!WC()->cart) return;.