Диагностика задачи: зачем добавлять видео в корзину WooCommerce
В интернет-магазинах на WooCommerce иногда требуется продавать видеофайлы или видеокурсы, подключая их к товарам. Часто возникает задача — автоматически добавлять видеофайл в корзину вместе с основным товаром, либо при определённых условиях, чтобы упростить покупку и избежать ручного выбора пользователем.
Типичная проблема — видео не добавляется, или добавляется, но не синхронизируется с остальными товарами корзины, либо не проигрывается после покупки.
Как работать с видео в WooCommerce: ключевые моменты
- Видео как товар или как дополнительный элемент (товар-аксессуар).
- Добавление видео в корзину через программное добавление товаров (функция
WC()->cart->add_to_cart()). - Связывание видео с основным товаром через мета-поля или custom fields.
- Обработка корзины через хуки WooCommerce (
woocommerce_add_to_cart,woocommerce_before_calculate_totals).
Пошаговое решение: автоматическое добавление видео в корзину при добавлении основного товара
1. Определяем ID видео товара
Для начала нужно знать ID видео товара, который нужно автоматически добавить. Допустим, ID видео — 123.
2. Добавляем код в файл functions.php темы или в плагин
add_action('woocommerce_add_to_cart', 'auto_add_video_product_to_cart', 10, 6);
function auto_add_video_product_to_cart($cart_item_key, $product_id, $quantity, $variation_id, $variation, $cart_item_data) {
// ID основного товара, при добавлении которого нужно добавить видео
$main_product_id = 456;
// ID видео товара
$video_product_id = 123;
if ($product_id == $main_product_id) {
// Проверяем, что видео товар ещё не в корзине
$found = false;
foreach (WC()->cart->get_cart() as $cart_item) {
if ($cart_item['product_id'] == $video_product_id) {
$found = true;
break;
}
}
if (!$found) {
WC()->cart->add_to_cart($video_product_id);
}
}
}3. Обработка удаления: чтобы видео удалялось, если удалён основной товар
add_action('woocommerce_cart_item_removed', 'remove_video_when_main_removed', 10, 2);
function remove_video_when_main_removed($cart_item_key, $cart) {
$cart_items = $cart->get_cart();
$main_product_id = 456;
$video_product_id = 123;
$main_exists = false;
foreach ($cart_items as $key => $item) {
if ($item['product_id'] == $main_product_id) {
$main_exists = true;
break;
}
}
if (!$main_exists) {
// Удаляем видео из корзины
foreach ($cart_items as $key => $item) {
if ($item['product_id'] == $video_product_id) {
$cart->remove_cart_item($key);
}
}
}
}Проверка результата
- Добавьте в корзину основной товар с ID 456.
- Проверьте, что в корзине автоматически появился видео товар с ID 123.
- Удалите основной товар из корзины — видео товар должен удалиться автоматически.
- Оформите заказ и убедитесь, что видеофайл доступен для скачивания или просмотра.
Частые ошибки и как их исправить
- Видео не добавляется в корзину: проверьте правильность ID видео товара, убедитесь, что товар опубликован и доступен.
- Видео добавляется несколько раз: добавьте проверку, чтобы видео не добавлялось повторно (как в коде выше).
- Видео не удаляется при удалении основного товара: убедитесь, что обработчик удаления корректно проверяет наличие основного товара в корзине.
- Конфликт с другими плагинами корзины: протестируйте на чистом WooCommerce, отключите сторонние расширения.
Практические советы по безопасности и производительности
- Не используйте хук
woocommerce_before_calculate_totalsдля добавления товаров в корзину — это может привести к бесконечным циклам. - Для больших магазинов с множеством товаров используйте опцию meta data для связывания продуктов, чтобы избежать жёсткой привязки ID в коде.
- Всегда проверяйте наличие товара в корзине перед добавлением, чтобы избежать дублирования и нагрузки на сессию.
- Ограничьте права доступа к видеофайлам через WooCommerce Downloadable Products, чтобы избежать несанкционированного скачивания.
Сравнение вариантов реализации
| Метод | Плюсы | Минусы | Пример |
|---|---|---|---|
Программное добавление через хук woocommerce_add_to_cart | Гибко, быстро, без плагинов | Нужен код, требует поддержки | Код из статьи |
| Плагин для связанных товаров (например, Product Bundles) | Простой интерфейс, много функций | Платный, дополнительная нагрузка | WooCommerce Product Bundles |
| Использование групповых товаров или вариаций | Встроено в WooCommerce | Менее гибко для видео | Стандартные вариации |