Автоматическое создание и отправка push-уведомлений при изменении заказов WordPress

Зачем нужны push-уведомления для заказов в WordPress

В современных интернет-магазинах мгновенное информирование менеджеров и клиентов о статусе заказа критично для оперативной работы и высокого уровня сервиса. Push-уведомления позволяют в режиме реального времени оповещать о важных событиях – оформлении, изменении или отмене заказа, оплате и доставке.

Для WordPress с плагином WooCommerce или кастомными решениями такой функционал можно внедрить самостоятельно, значительно повысив удобство работы с заказами и минимизировав задержки в коммуникации.

В этой статье подробно рассмотрим, как настроить автоматическое создание и отправку push-уведомлений при изменении заказов в WordPress, используя собственный код и бесплатные библиотеки.

Выбор технологии для push-уведомлений

Для отправки push-уведомлений в браузерах и мобильных приложениях обычно используется технология Web Push на базе Service Workers и Push API. В WordPress можно интегрировать эту технологию через JS и PHP, чтобы уведомления отправлялись при событиях, связанных с заказами.

Наиболее удобным вариантом будет использование сервиса Firebase Cloud Messaging (FCM) или open-source библиотеки web-push-php для отправки push-сообщений.

В примерах ниже мы используем библиотеку web-push-php, которая не требует сторонних сервисов и хранит все данные на вашем сервере.

Настройка подписки на push-уведомления в клиентской части

Для начала нужно реализовать на сайте механизм подписки пользователей на push-уведомления. Пример минимального кода для регистрации Service Worker и запроса разрешения:

if ('serviceWorker' in navigator) {
  navigator.serviceWorker.register('/service-worker.js')
    .then(function(registration) {
      console.log('Service Worker зарегистрирован с областью:', registration.scope);
      subscribeUserToPush(registration);
    })
    .catch(function(error) {
      console.error('Ошибка регистрации Service Worker:', error);
    });
}

function subscribeUserToPush(registration) {
  return registration.pushManager.getSubscription()
    .then(function(subscription) {
      if (subscription) {
        return subscription;
      }
      const vapidPublicKey = 'ВАШ_VAPID_PUBLIC_KEY';
      const convertedVapidKey = urlBase64ToUint8Array(vapidPublicKey);
      return registration.pushManager.subscribe({
        userVisibleOnly: true,
        applicationServerKey: convertedVapidKey
      });
    })
    .then(function(subscription) {
      // Отправить subscription на сервер для сохранения
      fetch('/save-subscription.php', {
        method: 'POST',
        headers: {'Content-Type': 'application/json'},
        body: JSON.stringify(subscription)
      });
    });
}

function urlBase64ToUint8Array(base64String) {
  const padding = '='.repeat((4 - base64String.length % 4) % 4);
  const base64 = (base64String + padding).replace(/-/g, '+').replace(/_/g, '/');
  const rawData = window.atob(base64);
  const outputArray = new Uint8Array(rawData.length);
  for (let i = 0; i < rawData.length; ++i) {
    outputArray[i] = rawData.charCodeAt(i);
  }
  return outputArray;
}

Service Worker (service-worker.js) должен обрабатывать событие push и отображать уведомление:

self.addEventListener('push', function(event) {
  const data = event.data.json();
  const options = {
    body: data.body,
    icon: '/icon.png'
  };
  event.waitUntil(self.registration.showNotification(data.title, options));
});

Сохранение подписок и отправка уведомлений на сервере WordPress

На серверной стороне нужно написать обработчик, который будет сохранять подписки в базе данных WordPress и отправлять уведомления при изменении заказа.

Создадим таблицу для подписок или используем опции/постмета. Для простоты воспользуемся опцией:

function wporder_save_subscription() {
  $subscription = json_decode(file_get_contents('php://input'), true);
  if (!$subscription) {
    wp_send_json_error('Нет данных подписки');
  }
  $subs = get_option('wporder_push_subscriptions', []);
  $subs[] = $subscription;
  update_option('wporder_push_subscriptions', $subs);
  wp_send_json_success();
}
add_action('wp_ajax_nopriv_wporder_save_subscription', 'wporder_save_subscription');
add_action('wp_ajax_wporder_save_subscription', 'wporder_save_subscription');

Теперь подключим библиотеку web-push-php через Composer и реализуем функцию отправки уведомлений:

require_once 'vendor/autoload.php';
use Minishlink\WebPush\WebPush;
use Minishlink\WebPush\Subscription;

function wporder_send_push_notifications($order_id) {
  $subscriptions = get_option('wporder_push_subscriptions', []);
  if (empty($subscriptions)) {
    return;
  }

  $order = wc_get_order($order_id);
  $title = 'Изменение заказа #'. $order_id;
  $body = 'Статус заказа изменён на: ' . $order->get_status();

  $auth = [
    'VAPID' => [
      'subject' => 'mailto:admin@wporder.ru',
      'publicKey' => 'ВАШ_VAPID_PUBLIC_KEY',
      'privateKey' => 'ВАШ_VAPID_PRIVATE_KEY',
    ],
  ];

  $webPush = new WebPush($auth);

  foreach ($subscriptions as $sub) {
    $subscription = Subscription::create($sub);
    $webPush->queueNotification(
      $subscription,
      json_encode(['title' => $title, 'body' => $body])
    );
  }

  foreach ($webPush->flush() as $report) {
    if (!$report->isSuccess()) {
      error_log('Не удалось отправить push: ' . $report->getReason());
    }
  }
}

add_action('woocommerce_order_status_changed', 'wporder_send_push_notifications', 10, 1);

Обработка ошибок и безопасность

Важно контролировать размер базы подписок, удалять невалидные и устаревшие записи, чтобы не перегружать сервер и не отправлять уведомления несуществующим клиентам.

Для этого можно реализовать периодическую проверку подписок и обработку ошибок с помощью $report->isSuccess(). Также следует защищать endpoint сохранения подписок от злоумышленников, например, с помощью nonce или авторизации.

Альтернативные решения и плагины

Если нет желания писать код, можно использовать готовые плагины для push-уведомлений, например:

  • OneSignal Push Notifications — бесплатный и популярный сервис с поддержкой WooCommerce.
  • My Popup от WPSHOP — можно адаптировать для уведомлений и акций.

Однако самостоятельная реализация с помощью web-push-php даёт полный контроль над процессом, минимизацию зависимостей и максимальную гибкость.

WooCommerce: автоматическое отключение отправки писем после отмены заказа
14.07.2026
WooCommerce: отключение платёжных методов по расписанию с помощью кода
18.06.2026
WooCommerce: установка и настройка дополнительных пользовательских стоимостей в заказах
29.06.2026
Автоматизация создания и редактирования заказов в WordPress
27.11.2025
Автоматическое создание резервных копий WordPress с помощью PHP и плагинов
21.02.2026