Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Оглавление

Корзина

Корзина — объект 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;.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.