Зачем нужны 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 даёт полный контроль над процессом, минимизацию зависимостей и максимальную гибкость.