Автоматические уведомления — важный инструмент для взаимодействия с пользователями на сайте WordPress. Они помогают информировать посетителей о событиях, изменениях или действиях без необходимости обновлять страницу вручную. В этой статье мы подробно разберём, как создать собственную систему автоматических уведомлений, используя хуки WordPress и AJAX, а также приведём примеры кода для реализации.
Понимание хуков WordPress для уведомлений
Хуки в WordPress делятся на два типа: действия (actions) и фильтры (filters). Для создания автоматических уведомлений чаще всего используют действия, так как они позволяют выполнить определённый код в нужный момент.
Например, можно использовать хук save_post для запуска уведомления после сохранения записи, или comment_post — после добавления комментария. При этом важно правильно обрабатывать данные и обеспечить безопасность.
Рассмотрим пример функции с префиксом wptool_, которая отправляет уведомление администратору при добавлении новой записи:
function wptool_send_new_post_notification($post_id) {
if (wp_is_post_revision($post_id)) {
return;
}
$post = get_post($post_id);
$admin_email = get_option('admin_email');
$subject = 'Новая запись на сайте';
$message = 'Создана новая запись: ' . $post->post_title . ' — ' . get_permalink($post_id);
wp_mail($admin_email, $subject, $message);
}
add_action('publish_post', 'wptool_send_new_post_notification');Этот простой код автоматически отправит письмо администратору при публикации новой записи.
Реализация динамических уведомлений через AJAX
Для создания уведомлений, которые появляются на странице без перезагрузки, нам понадобится AJAX. Это позволит клиентской части сайта запрашивать сервер о новых событиях и отображать их в режиме реального времени.
Основная идея — настроить JavaScript для регулярного опроса сервера и PHP-функцию, которая возвращает данные уведомлений. Ниже показан пример подключения AJAX в WordPress.
Шаг 1. Добавляем обработчик AJAX на сервере
function wptool_ajax_check_notifications() {
// Предположим, что уведомления хранятся в transient
$notifications = get_transient('wptool_notifications');
if (!$notifications) {
$notifications = [];
}
wp_send_json_success($notifications);
}
add_action('wp_ajax_check_notifications', 'wptool_ajax_check_notifications');
add_action('wp_ajax_nopriv_check_notifications', 'wptool_ajax_check_notifications');Здесь создаётся обработчик AJAX-запроса с действием check_notifications, который возвращает текущие уведомления в формате JSON.
Шаг 2. Добавляем JavaScript для опроса сервера
function wptool_enqueue_scripts() {
wp_enqueue_script('wptool-notifications', get_template_directory_uri() . '/js/notifications.js', ['jquery'], null, true);
wp_localize_script('wptool-notifications', 'wptool_ajax', [
'ajax_url' => admin_url('admin-ajax.php')
]);
}
add_action('wp_enqueue_scripts', 'wptool_enqueue_scripts');В этом коде регистрируем и подключаем скрипт, а также передаём в него URL для AJAX-запросов.
Пример содержимого файла notifications.js:
jQuery(document).ready(function($) {
function wptool_checkNotifications() {
$.post(wptool_ajax.ajax_url, { action: 'check_notifications' }, function(response) {
if(response.success && response.data.length) {
response.data.forEach(function(note) {
// Отображаем уведомление на сайте
alert(note.message); // для примера
});
}
});
}
// Проверяем уведомления каждые 30 секунд
setInterval(wptool_checkNotifications, 30000);
// Запуск при загрузке страницы
wptool_checkNotifications();
});Хранение и управление уведомлениями
Для хранения уведомлений можно использовать различные подходы: мета-поля, пользовательские таблицы, транзиенты или опции. В нашем примере — транзиенты, так как они удобны для кэширования на ограниченное время.
Добавим функцию для создания нового уведомления:
function wptool_add_notification($message) {
$notifications = get_transient('wptool_notifications');
if (!$notifications) {
$notifications = [];
}
$notifications[] = [
'message' => $message,
'time' => current_time('timestamp')
];
// Храним уведомления 1 час
set_transient('wptool_notifications', $notifications, HOUR_IN_SECONDS);
}Например, после публикации записи можно добавить уведомление:
function wptool_notify_new_post($post_id) {
if (wp_is_post_revision($post_id)) {
return;
}
$post = get_post($post_id);
wptool_add_notification('Опубликована новая запись: ' . $post->post_title);
}
add_action('publish_post', 'wptool_notify_new_post');Примеры полезных плагинов для уведомлений
Если вы хотите готовое решение или расширение функционала, рассмотрите следующие плагины:
- Notifications — мощный плагин для создания различных уведомлений с гибкими настройками.
- WPRemark — плагин для автоматизации обработки и отправки уведомлений с расширенными возможностями.
Использование таких плагинов сокращает время разработки и расширяет функционал без необходимости писать сложный код.
Безопасность и оптимизация уведомлений в WordPress
При разработке системы уведомлений убедитесь, что вы:
- Проверяете права пользователя в AJAX-обработчиках, если уведомления персональные.
- Используете nonce для защиты от CSRF-атак.
- Оптимизируете частоту запросов AJAX, чтобы не перегружать сервер.
- Очищаете старые уведомления и не храните в базе лишние данные.
Пример добавления nonce и проверки в AJAX-запросах:
function wptool_enqueue_scripts() {
wp_enqueue_script('wptool-notifications', get_template_directory_uri() . '/js/notifications.js', ['jquery'], null, true);
wp_localize_script('wptool-notifications', 'wptool_ajax', [
'ajax_url' => admin_url('admin-ajax.php'),
'nonce' => wp_create_nonce('wptool_notifications_nonce')
]);
}
add_action('wp_enqueue_scripts', 'wptool_enqueue_scripts');
function wptool_ajax_check_notifications() {
check_ajax_referer('wptool_notifications_nonce', 'nonce');
// Дальше обработка
}В скрипте JavaScript нужно передавать nonce вместе с запросом.
Вывод
Создание автоматических уведомлений в WordPress — задача, которую можно решить собственным кодом с помощью хуков и AJAX или с помощью специализированных плагинов. Важно продумать логику уведомлений, безопасность и удобство отображения для пользователей. Приведённые примеры помогут вам реализовать гибкую и эффективную систему уведомлений на вашем сайте.