wpquiz.ru wordpress WPQuiz.ru

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

Диагностика задачи: зачем добавлять WooCommerce функционал в квизы

Многие веб-мастера и разработчики сталкиваются с необходимостью интегрировать интерактивные квизы с процессом продаж на сайте WooCommerce. Например, пользователь после прохождения квиза должен получить индивидуальное предложение или скидку, основанную на ответах. Для этого важно понимать, как использовать хуки WooCommerce для динамического изменения корзины, оформления заказа и пользовательских уведомлений.

Основные WooCommerce хуки для интеграции с квизами

WooCommerce предоставляет множество хуков (actions и filters), которые позволяют вмешиваться в процесс добавления товаров в корзину, расчёта скидок и оформления заказа. Ниже ключевые из них:

  • woocommerce_add_to_cart — срабатывает при добавлении товара в корзину.
  • woocommerce_before_calculate_totals — позволяет изменить цену товаров в корзине до расчёта итогов.
  • woocommerce_checkout_create_order_line_item — даёт возможность добавить метаданные к строкам заказа.
  • woocommerce_email_order_details — позволяет модифицировать содержимое писем с деталями заказа.

Пошаговое решение: добавляем скидку по результатам квиза в WooCommerce через хук

Рассмотрим пример, как добавить скидку в корзину WooCommerce в зависимости от результата квиза, сохранённого в сессии пользователя.

1. Сохраняем результат квиза в сессию

add_action('wp_ajax_save_quiz_result', 'save_quiz_result_to_session');
add_action('wp_ajax_nopriv_save_quiz_result', 'save_quiz_result_to_session');
function save_quiz_result_to_session() {
    if ( isset($_POST['quiz_score']) ) {
        WC()->session->set('quiz_score', intval($_POST['quiz_score']));
        wp_send_json_success();
    } else {
        wp_send_json_error('No score provided');
    }
}

Этот код предполагает, что результат квиза отправляется AJAX-запросом на сервер и сохраняется в сессии WooCommerce.

2. Добавляем скидку в корзину на основе результата

add_action('woocommerce_cart_calculate_fees', 'apply_discount_based_on_quiz_score');
function apply_discount_based_on_quiz_score() {
    $score = WC()->session->get('quiz_score');
    if ( $score !== null ) {
        if ( $score >= 80 ) {
            $discount = WC()->cart->subtotal * 0.15; // 15% скидка
            WC()->cart->add_fee(__('Quiz Discount', 'your-textdomain'), -$discount);
        } elseif ( $score >= 50 ) {
            $discount = WC()->cart->subtotal * 0.07; // 7% скидка
            WC()->cart->add_fee(__('Quiz Discount', 'your-textdomain'), -$discount);
        }
    }
}

3. Добавляем метаданные в заказ для отчётности

add_action('woocommerce_checkout_create_order', 'add_quiz_score_to_order', 20, 2);
function add_quiz_score_to_order($order, $data) {
    $score = WC()->session->get('quiz_score');
    if ( $score !== null ) {
        $order->update_meta_data('quiz_score', $score);
    }
}

Проверка результата после внедрения

  • Пройдите квиз и отправьте результат через AJAX (проверьте в консоли DevTools, что запрос прошел успешно).
  • Добавьте товар в корзину и перейдите к корзине — должна появиться скидка с названием «Quiz Discount».
  • Оформите заказ и в админке WooCommerce проверьте метаданные заказа — параметр quiz_score должен содержать ваш результат.

Частые ошибки и как их исправить

  • Сессия WooCommerce не инициализирована: Убедитесь, что код вызывается после инициализации WooCommerce сессии. Используйте хуки woocommerce_init или wp_loaded.
  • AJAX запросы не работают: Проверьте правильность URL AJAX, наличие nonce и правильное подключение скриптов.
  • Скидка не отображается в корзине: Проверьте, что хук woocommerce_cart_calculate_fees подключён корректно и не конфликтует с другими плагинами.
  • Метаданные не сохраняются в заказе: Убедитесь, что вы используете хук woocommerce_checkout_create_order, а не woocommerce_checkout_order_processed.

Практические советы по безопасности и производительности

  • Валидация данных: всегда проверяйте и фильтруйте входящие данные из квиза, особенно при AJAX запросах.
  • Сессии WooCommerce: не храните большие объёмы данных в сессии, только необходимые параметры.
  • Оптимизация скидок: избегайте сложных вычислений в woocommerce_cart_calculate_fees, чтобы не замедлять процесс расчёта корзины.
  • Кэширование: интеграция с WooCommerce и квизом должна учитывать, что страницы с корзиной и оформлением заказа обычно не кэшируются.

Сравнение вариантов реализации скидок в WooCommerce по результатам квиза

ВариантОписаниеПлюсыМинусы
Использование хука woocommerce_cart_calculate_feesДобавление скидки как дополнительного сбросаПростая реализация, легко изменить условияСкидка видна как отдельный элемент в корзине, не меняет цену товара
Изменение цены товара через woocommerce_before_calculate_totalsПрямое изменение цены товара в корзинеСкидка применяется на уровне товара, отражается вездеСложнее в поддержке, может конфликтовать с другими плагинами
Создание купона программноГенерация и применение купона при прохождении квизаИспользуется стандартный механизм WooCommerceСложнее контролировать, требуется управление сроками и пользователями
×

Пора действовать!

Скидки на
WordPress!

-20%
на премиум темы

Успей купить ⋙