Диагностика задачи: зачем нужно сообщение о закрытии тикета
При работе с системой поддержки на WordPress с помощью WPtickets часто возникает необходимость уведомлять клиента, что его тикет был закрыт. Это важно для повышения прозрачности коммуникации и улучшения клиентского сервиса. По умолчанию WPtickets не отправляет автоматическое сообщение при смене статуса тикета на "закрыт". В этой статье разберём, как добавить такую функциональность с помощью кастомного кода.
Пошаговое решение: автоматическое сообщение при закрытии тикета
1. Используем хук для отслеживания смены статуса тикета
WPtickets хранит статусы тикетов в метаданных и использует стандартные WordPress-хуки. Для реакции на смену статуса используем хук updated_post_meta, проверяя изменение мета-ключа статуса.
function wptickets_auto_close_message( $meta_id, $post_id, $meta_key, $_meta_value ) {
if ( $meta_key !== '_wpticket_status' ) return; // проверяем мета ключ статуса
$new_status = $_meta_value;
if ( $new_status !== 'closed' ) return; // реагируем только на закрытие
$post = get_post( $post_id );
if ( ! $post || $post->post_type !== 'wptickets' ) return;
// Получаем ID автора тикета (клиента)
$author_id = $post->post_author;
// Добавляем системный комментарий к тикету
$message = 'Ваш тикет был закрыт. Если у вас остались вопросы, пожалуйста, создайте новый тикет.';
wp_insert_comment( array(
'comment_post_ID' => $post_id,
'comment_content' => $message,
'user_id' => 0, // системное сообщение
'comment_author' => 'Система поддержки',
'comment_approved' => 1,
'comment_type' => 'wpticket_note', // тип комментария для заметок
) );
// Отправляем email клиенту
$user = get_user_by( 'ID', $author_id );
if ( $user && $user->user_email ) {
$subject = 'Ваш тикет #' . $post_id . ' закрыт';
$body = "Здравствуйте,\n\nВаш тикет был закрыт. Если у вас есть дополнительные вопросы, пожалуйста, свяжитесь с нами снова.\n\nСпасибо!";
wp_mail( $user->user_email, $subject, $body );
}
}
add_action( 'updated_postmeta', 'wptickets_auto_close_message', 10, 4 );2. Куда добавить код
Рекомендуется добавить данный код в файл functions.php вашей дочерней темы или создать небольшой плагин, чтобы код не потерялся при обновлении темы.
Проверка результата после внедрения
- Откройте любой тикет в админ-панели WPtickets.
- Измените статус тикета на «закрыт».
- Проверьте, что в комментариях тикета появился системный комментарий с уведомлением.
- Убедитесь, что на email пользователя, создавшего тикет, пришло письмо с уведомлением.
Для отладки рекомендуется включить WP_DEBUG и использовать error_log внутри функции при необходимости.
Частые ошибки и как их исправить
- Письмо не отправляется: проверьте настройки SMTP на сервере или используйте плагины для настройки почты (например, WP Mail SMTP).
- Сообщение не появляется в комментариях: проверьте правильность мета-ключа статуса, а также что хук
updated_postmetaвызывается для нужного поста типаwptickets. - Дублирование сообщений: если меняется статус не на «закрыт», убедитесь, что условие строго проверяет статус именно «closed».
- Проблемы с типом комментария: WPtickets использует разные типы комментариев, важно указать
comment_typeкакwpticket_noteдля системных заметок.
Практические советы по безопасности и производительности
- Всегда проверяйте входящие данные и используйте nonce при работе с формами, если добавляете UI для изменения статуса.
- Не вызывайте тяжелые операции внутри хука – если нужно, используйте очередь или отложенное выполнение (wp_cron).
- Для улучшения производительности можно кешировать данные пользователя, чтобы не делать лишние запросы к базе при массовом обновлении статусов.
Краткий чек-лист внедрения
- Добавить функцию на хук
updated_postmeta. - Проверить мета-ключ статуса на «closed».
- Добавить комментарий с системным сообщением к тикету.
- Отправить email пользователю, создавшему тикет.
- Проверить работу на тестовом тикете.
- Отладить и устранить ошибки по результатам теста.
Сравнение вариантов реализации
| Вариант | Описание | Плюсы | Минусы |
|---|---|---|---|
Код на хуке updated_postmeta | Отслеживает смену статуса и выполняет действия | Гибкость, нет зависимости от сторонних плагинов | Требует знаний PHP, возможна нагрузка при массовых изменениях |
| Плагин автоматизации | Готовые решения для уведомлений | Простота установки, часто с UI настройки | Могут быть избыточными, нагрузка на сайт |
| WP Remark + WPtickets | Интеграция для автоматических сообщений и триггеров | Дополнительные возможности, удобство | Платные расширения, сложность настройки |