Диагностика проблемы: почему popup не исчезает после оформления заказа
В WooCommerce popup часто используется для продвижения акций, подписок или сбора отзывов. Однако при неправильной реализации всплывающее окно может продолжать показываться даже после того, как пользователь успешно оформил заказ. Это раздражает клиента и ухудшает UX.
Основные причины проблемы:
- Popup не учитывает состояние заказа в сессии пользователя;
- Отсутствует проверка страницы «Спасибо за заказ»;
- Использование cookie/локального хранилища без правильной логики;
- Конфликты с AJAX-обновлениями WooCommerce;
- Неправильное подключение скриптов, отвечающих за показ/скрытие popup.
Пошаговое решение: отключение popup после успешного заказа в WooCommerce
1. Определяем страницу «Спасибо за заказ»
WooCommerce после оформления заказа переадресует пользователя на страницу «thankyou». На этом этапе нужно отключить показ popup.
Для проверки используем условный тег is_order_received_page().
2. Добавляем проверку в шаблон popup
Если popup подключается через шаблон темы или плагина, оберните вызов popup в условие, чтобы он не рендерился на странице заказа:
if ( ! function_exists('is_order_received_page') || ! is_order_received_page() ) {
// Код вывода popup
}3. Использование JavaScript для удаления popup после заказа
Если popup создаётся через JS, можно добавить скрипт, который проверит URL и скроет popup:
document.addEventListener('DOMContentLoaded', function() {
if (window.location.href.indexOf('order-received') !== -1) {
var popup = document.querySelector('.popup-class');
if (popup) {
popup.style.display = 'none';
}
}
});4. Управление cookie/локальным хранилищем
Если показ popup контролируется cookie, установите флаг после успешного заказа и проверяйте его перед показом. Пример установки cookie в PHP:
add_action('woocommerce_thankyou', 'set_popup_disable_cookie');
function set_popup_disable_cookie( $order_id ) {
if ( ! headers_sent() ) {
setcookie('popup_disabled', '1', time() + 86400, COOKIEPATH, COOKIE_DOMAIN);
}
}В JS проверяем cookie перед показом:
function getCookie(name) {
let matches = document.cookie.match(new RegExp(
'(?:^|; )' + name.replace(/([\.$?*|{}()\[\]\\\/\+^])/g, '\\$1') + '=([^;]*)'
));
return matches ? decodeURIComponent(matches[1]) : undefined;
}
if (getCookie('popup_disabled') !== '1') {
// Показать popup
}Проверка результата после внедрения
- Оформите тестовый заказ в WooCommerce;
- После перехода на страницу «Спасибо за заказ» убедитесь, что popup не отображается;
- Обновите другие страницы сайта, чтобы проверить, что popup по-прежнему работает там, где нужно;
- Очистите cookie и повторите проверку для разных ролей пользователей и устройств;
- Проверьте работу popup при AJAX-загрузках (например, в корзине).
Частые ошибки и как исправить
- Проверка не на той странице: Использование
is_checkout()вместоis_order_received_page()— popup будет скрываться не только после заказа, но и на странице оформления. - Cookie не устанавливаются из-за заголовков: Если cookie ставятся после вывода контента, PHP выдаст ошибку. Решение — ставить cookie на хуках, вызываемых до вывода (например,
woocommerce_thankyou). - JavaScript запускается до загрузки DOM: Используйте
DOMContentLoadedили jQuery$(document).ready()для корректной работы. - Конфликты с кэшированием: Статические HTML-кэши могут показывать устаревшую версию страницы, где popup не скрыт. Настройте исключения для страниц заказа.
Практические советы по безопасности и производительности
- Минимизируйте количество JS-кода на странице, отключая popup сразу на сервере там, где нужно.
- Если используете cookie, установите флаг с ограниченным сроком действия (например, 24 часа), чтобы popup мог появляться повторно через время.
- Не храните в cookie чувствительную информацию, только флаги состояния.
- Проверяйте совместимость с плагинами кэширования и AJAX-обновлений WooCommerce.
Сравнение вариантов отключения popup после заказа
| Метод | Плюсы | Минусы |
|---|---|---|
| PHP: is_order_received_page() | Отключение на сервере, быстро, без мигания popup | Требуется доступ к шаблонам, не подходит если popup генерируется клиентом |
| JavaScript: проверка URL | Просто добавить, не требует изменения PHP | Возможна кратковременная отрисовка popup перед скрытием |
| Cookie-флаг после заказа | Гибко, работает с AJAX и повторным посещением | Сложнее реализовать, возможны проблемы с кэшированием |