Что такое хук woocommerce_add_to_cart и зачем он нужен
Хук woocommerce_add_to_cart — это action-хук, который срабатывает сразу после добавления товара в корзину WooCommerce. Он позволяет выполнять дополнительные действия: изменять данные сессии, отправлять уведомления, менять поведение корзины или записывать кастомные логи. Используется для интеграции кастомной логики без изменения ядра WooCommerce.
Диагностика: когда и почему стоит использовать woocommerce_add_to_cart
Типичные задачи, для которых подходит этот хук:
- Автоматическое добавление сопутствующих товаров при добавлении основного товара.
- Отправка кастомных уведомлений клиенту или администратору.
- Запись дополнительных данных о добавлении товара (например, пользовательские метки).
- Блокировка добавления товара при определённых условиях и возврат ошибки.
Проверить, срабатывает ли хук, можно с помощью простого лога:
add_action('woocommerce_add_to_cart', function($cart_item_key, $product_id, $quantity, $variation_id, $variation, $cart_item_data) {
error_log('Товар добавлен в корзину: ' . $product_id);
}, 10, 6);Если в логе PHP появится сообщение, значит хук работает корректно.
Пошаговое решение: как добавить сопутствующий товар автоматически
Пример: при добавлении товара с ID 123 автоматически добавить товар с ID 456.
add_action('woocommerce_add_to_cart', 'wpurok_add_related_product_to_cart', 10, 6);
function wpurok_add_related_product_to_cart($cart_item_key, $product_id, $quantity, $variation_id, $variation, $cart_item_data) {
if ($product_id == 123) {
$related_product_id = 456;
$found = false;
// Проверяем, есть ли уже связанный товар в корзине
foreach (WC()->cart->get_cart() as $cart_item) {
if ($cart_item['product_id'] == $related_product_id) {
$found = true;
break;
}
}
if (!$found) {
WC()->cart->add_to_cart($related_product_id);
}
}
}Этот код нужно добавить в файл functions.php вашей темы или в кастомный плагин.
Как проверить результат
- Откройте сайт, добавьте товар с ID 123 в корзину.
- Перейдите в корзину и убедитесь, что товар 456 добавился автоматически.
- Проверьте, что повторное добавление товара 123 не дублирует товар 456.
Другие сценарии использования хука woocommerce_add_to_cart
1. Отправка письма администратору при добавлении определённого товара
add_action('woocommerce_add_to_cart', 'wpurok_notify_admin_on_add', 10, 6);
function wpurok_notify_admin_on_add($cart_item_key, $product_id, $quantity, $variation_id, $variation, $cart_item_data) {
if ($product_id == 789) {
wp_mail(get_option('admin_email'), 'Товар добавлен в корзину', 'Пользователь добавил товар с ID 789 в корзину');
}
}2. Блокировка добавления товара с сообщением об ошибке
add_filter('woocommerce_add_to_cart_validation', 'wpurok_block_product_add_to_cart', 10, 3);
function wpurok_block_product_add_to_cart($passed, $product_id, $quantity) {
if ($product_id == 321) {
wc_add_notice('Этот товар временно недоступен для покупки.', 'error');
return false;
}
return $passed;
}Чек-лист для успешной работы с woocommerce_add_to_cart
- Используйте правильное количество аргументов (6) при подключении action.
- Проверяйте, что функция не вызывает бесконечные циклы, например, при добавлении товаров изнутри хука.
- Для блокировки добавления используйте фильтр
woocommerce_add_to_cart_validation, а не action. - Тестируйте изменения в режиме отладки, используя
error_logдля проверки срабатывания. - Используйте
WC()->cart->get_cart()для доступа к текущим товарам в корзине.
Частые ошибки при работе с этим хуком и как их исправить
Ошибка 1: Дублирование товаров
Причина: добавление сопутствующего товара без проверки существования его в корзине.
Решение: всегда проверяйте корзину перед добавлением, как в примере выше.
Ошибка 2: Проблемы с аргументами функции
Причина: неверное количество или порядок аргументов при подключении хука.
Решение: указывайте 6 аргументов и соблюдайте порядок: $cart_item_key, $product_id, $quantity, $variation_id, $variation, $cart_item_data.
Ошибка 3: Использование action вместо фильтра для валидации
Причина: попытка блокировать добавление товара через woocommerce_add_to_cart, который срабатывает после добавления.
Решение: для блокировки используйте фильтр woocommerce_add_to_cart_validation.
Практические советы по производительности и безопасности
- Избегайте сложных запросов к базе данных внутри хука, это может замедлить добавление товара.
- Не добавляйте товары в корзину внутри хука без проверки — это может вызвать рекурсию.
- Используйте nonce и проверки прав пользователя, если добавляете кастомные запросы через AJAX в связке с этим хуком.
- Для массовых операций добавления лучше использовать отдельные функции, вызываемые вне хука.
Сравнение способов решения задачи автоматического добавления товара
| Метод | Плюсы | Минусы |
|---|---|---|
Хук woocommerce_add_to_cart | Простой, срабатывает сразу после добавления | Риск рекурсии, нужно проверять корзину |
| JavaScript-обработка кнопки «Добавить в корзину» | Гибкость, можно менять интерфейс | Зависит от клиента, может быть отключен JS |
| Кастомная кнопка с серверной логикой | Полный контроль, можно делать сложные проверки | Требует больше кода и настроек |