Диагностика проблемы: зачем нужны хуки WooCommerce в квизах WordPress
Если вы интегрируете квизы с WooCommerce — например, для продажи результатов, премиум-доступа к квизам или автоматического применения скидок — стандартного функционала плагина квизов часто недостаточно. Нужно добавить логику, реагирующую на события WooCommerce: оформление заказа, изменение статуса, добавление товаров в корзину. При этом важно делать это через хуки, чтобы не ломать обновления плагинов и темы.
Пошаговое решение: добавляем дополнительный функционал через хуки WooCommerce
1. Подключение действия при оформлении заказа
Допустим, вы хотите проверить, прошёл ли пользователь квиз, и только тогда разрешить покупку или применить скидку.
add_action('woocommerce_checkout_process', 'check_quiz_completion_before_checkout');
function check_quiz_completion_before_checkout() {
if (!current_user_can('manage_options')) { // исключаем админов
$user_id = get_current_user_id();
$quiz_completed = get_user_meta($user_id, 'quiz_completed', true);
if (!$quiz_completed) {
wc_add_notice('Вы должны пройти квиз перед оформлением заказа.', 'error');
}
}
}2. Автоматическое применение скидки при добавлении товара, связанного с квизом
Добавим скидку 15%, если в корзину попадает товар с меткой quiz_product.
add_action('woocommerce_before_calculate_totals', 'apply_quiz_discount_in_cart');
function apply_quiz_discount_in_cart($cart) {
if (is_admin() && !defined('DOING_AJAX'))
return;
foreach ($cart->get_cart() as $cart_item_key => $cart_item) {
if (has_term('quiz_product', 'product_tag', $cart_item['product_id'])) {
$price = $cart_item['data']->get_price();
$discounted_price = $price * 0.85; // скидка 15%
$cart_item['data']->set_price($discounted_price);
}
}
}Проверка результата после внедрения
- Перейдите в корзину и добавьте товар с тегом
quiz_product. Цена должна уменьшиться на 15%. - Попробуйте оформить заказ, не пройдя квиз (для теста очистите мета
quiz_completedу пользователя). Проверка должна заблокировать оформление с ошибкой. - После прохождения квиза (установите
update_user_meta($user_id, 'quiz_completed', true);вручную) — оформление заказа должно работать без ошибок.
Частые ошибки и как их исправить
- Ошибка: Хук не срабатывает — проверьте, подключен ли ваш код в functions.php или в плагине и нет ли синтаксических ошибок.
- Ошибка: Скидка не применяется — убедитесь, что у товара есть нужный тег, а функция
has_term()вызывается корректно. - Ошибка: Сообщение об ошибке при оформлении заказа не показывается — проверьте, что используете
wc_add_noticeи что проверка происходит на хукwoocommerce_checkout_process. - Ошибка: Цена товара сбрасывается после обновления страницы — используйте хук
woocommerce_before_calculate_totalsи не изменяйте цену напрямую в базе, только в объекте товара в корзине.
Практические советы по безопасности и производительности
- Используйте проверку
is_admin() && !defined('DOING_AJAX'), чтобы не выполнять лишние действия в админке. - Не сохраняйте цены со скидкой в метаданных товара, чтобы избежать конфликтов с другими плагинами.
- Для проверки статуса квиза используйте
get_user_metaс кешированием, если вызываете часто. - Всегда очищайте кэш WooCommerce при изменениях товаров или пользовательских метаданных.
Сравнение подходов к интеграции квизов с WooCommerce
| Подход | Плюсы | Минусы |
|---|---|---|
| Использование хуков WooCommerce | Гибко, не требует модификации ядра, совместимо с обновлениями | Требует знаний PHP, возможны конфликты с другими хуками |
| Использование плагинов интеграции | Быстро, без кода, поддержка разработчиков | Может быть тяжеловесным, ограничена кастомизация |
| Прямое изменение шаблонов WooCommerce | Полный контроль над выводом и логикой | Сложно поддерживать, ломается при обновлениях |