wpquiz.ru wordpress WPQuiz.ru

Как использовать хуки WooCommerce для дополнительного функционала в квизах WordPress

Диагностика проблемы: зачем нужны хуки 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Полный контроль над выводом и логикойСложно поддерживать, ломается при обновлениях
×
Обнови свой WordPress!

Держи скидку 15% на премиум тему Reboot

Купить со скидкой ⋙