Диагностика проблемы: почему popup не отключается после оплаты заказа в WooCommerce
Частая задача при работе с WooCommerce и popup — отключить всплывающее окно после того, как пользователь успешно оплатил заказ. Это позволяет не раздражать клиента повторными уведомлениями или предложениями. Однако, многие сталкиваются с тем, что popup продолжает показываться даже после оплаты, потому что отсутствует правильная интеграция с событиями WooCommerce.
Основная причина — отсутствие использования подходящего хука, который срабатывает в момент изменения статуса заказа на «завершён» или «оплачен», или неверное управление куки/локальным хранилищем, отвечающим за показ popup.
Пошаговое решение: отключение popup после успешной оплаты заказа в WooCommerce
1. Отслеживаем изменение статуса заказа через хук WooCommerce
WooCommerce предоставляет хук woocommerce_order_status_changed, который срабатывает при смене статуса заказа. Используя его, можно добавить логику для установки куки или сессии, чтобы отключить popup.
add_action('woocommerce_order_status_changed', 'disable_popup_after_order_payment', 10, 4);
function disable_popup_after_order_payment($order_id, $old_status, $new_status, $order) {
// Проверяем новый статус
if (in_array($new_status, array('processing', 'completed'))) {
// Устанавливаем куки на месяц, чтобы отключить popup
setcookie('disable_popup', '1', time() + MONTH_IN_SECONDS, COOKIEPATH, COOKIE_DOMAIN);
}
}
2. Проверяем наличие куки в шаблоне popup
В файле шаблона popup или в скрипте, который отвечает за показ окна, добавьте проверку на куки disable_popup. Если куки установлена, popup не показывается.
if (!isset($_COOKIE['disable_popup'])) {
// Код показа popup
echo '<div id="my-popup">...</div>';
}
3. Альтернатива — управление через JavaScript и локальное хранилище (localStorage)
Если popup показывается через JS, то сервер может добавить в страницу флаг для отключения popup, например, через wp_localize_script:
function wpdocs_localize_popup_flag() {
$disable_popup = isset($_COOKIE['disable_popup']) ? true : false;
wp_localize_script('popup-script-handle', 'popupData', array(
'disablePopup' => $disable_popup
));
}
add_action('wp_enqueue_scripts', 'wpdocs_localize_popup_flag');
В JS проверяем:
if (!popupData.disablePopup) {
// показываем popup
}
Проверка результата после внедрения
- Создайте тестовый заказ в WooCommerce и оплатите его.
- После оплаты обновите страницу и убедитесь, что popup не появляется.
- Откройте сайт в режиме инкогнито (без куки) — popup должен показаться.
- Проверьте наличие куки
disable_popupв браузере.
Частые ошибки и как их исправить
- Хук не срабатывает — проверьте, что функция подключена в functions.php или в плагине, и что WooCommerce активен.
- Куки не устанавливаются — куки должны устанавливаться до вывода HTML, иначе будет ошибка. Проверьте, что нет лишнего вывода до
setcookie. - Popup показывает игнорируя куки — проверьте, что в шаблоне или JS корректно проверяется куки/флаг.
- Куки не удаляются — если нужно сбросить отключение popup, добавьте логику удаления куки.
Практические советы по безопасности и производительности
- Используйте хук
woocommerce_order_status_changedс правильными приоритетами и не перегружайте его тяжелыми операциями. - Для установки куки используйте константы
COOKIEPATHиCOOKIE_DOMAINдля корректного домена и пути. - Не храните в куки чувствительные данные — используйте флаг для отключения popup.
- Если popup содержит формы или скрипты, убедитесь в их оптимизации, чтобы не замедлять страницу.
Сравнение вариантов реализации отключения popup после оплаты заказа
| Метод | Простота реализации | Контроль на клиенте | Недостатки |
|---|---|---|---|
| Установка куки через PHP (хук WooCommerce) | Средняя | Средний (нужно проверять в JS или PHP) | Требуется правильный порядок вызова setcookie, куки могут блокироваться браузером |
| Управление через JS localStorage | Высокая | Полный контроль на клиенте | Менее безопасно, легко сбрасывается пользователем |
| Серверный рендеринг с проверкой статуса заказа | Сложнее | Высокий | Нагрузка на сервер, требует дополнительного кэширования |