Плагин WPtickets для WordPress отлично подходит для организации поддержки клиентов через систему тикетов. Однако стандартный функционал плагина не всегда покрывает все потребности, например, возможность прикреплять вложения к тикетам. В этой статье мы разберём, как добавить функционал вложений в WPtickets с помощью кастомного кода и облегчим работу пользователей.
Зачем нужны вложения в тикетах WPtickets
Возможность прикреплять файлы к тикетам существенно улучшает коммуникацию между клиентом и службой поддержки. Часто пользователям нужно отправить скриншоты ошибок, документы, логи или другие материалы, которые помогут быстрее и точнее решить проблему.
Без этой функции приходится использовать сторонние средства, что создаёт неудобства и замедляет работу поддержки. Поэтому интеграция вложений прямо в WPtickets — важный шаг к более профессиональной системе поддержки.
При этом важно обеспечить безопасность — ограничения по типу и размеру файлов, проверку на вредоносные скрипты и контроль доступа.
Добавление поля загрузки вложений в форму создания тикета
Для начала добавим на форму создания тикета поле для загрузки файла. WPtickets использует стандартные хуки WordPress, поэтому мы можем легко расширить форму.
Добавим в functions.php вашей темы следующий код:
function wptickets_add_attachment_field() {
echo '<p><label for="wptickets_attachment">Прикрепить файл:</label><br><input type="file" name="wptickets_attachment" id="wptickets_attachment" /></p>';
}
add_action('wptickets_before_ticket_form', 'wptickets_add_attachment_field');Этот код выведет на форму дополнительное поле загрузки файла с идентификатором wptickets_attachment.
Обработка загруженного файла при отправке тикета
Теперь необходимо сохранить загруженный файл при создании тикета. Для этого используем хук, который вызывается при сохранении тикета.
function wptickets_handle_attachment_on_submit($ticket_id) {
if (!empty($_FILES['wptickets_attachment']) && !empty($_FILES['wptickets_attachment']['tmp_name'])) {
$file = $_FILES['wptickets_attachment'];
// Проверяем ошибки загрузки
if ($file['error'] === UPLOAD_ERR_OK) {
$allowed_types = ['image/jpeg', 'image/png', 'application/pdf', 'text/plain'];
if (in_array($file['type'], $allowed_types)) {
require_once(ABSPATH . 'wp-admin/includes/file.php');
$overrides = ['test_form' => false];
$uploaded_file = wp_handle_upload($file, $overrides);
if (!isset($uploaded_file['error'])) {
// Сохраняем URL вложения как мета-данные тикета
update_post_meta($ticket_id, '_wptickets_attachment_url', esc_url_raw($uploaded_file['url']));
}
}
}
}
}
add_action('wptickets_ticket_created', 'wptickets_handle_attachment_on_submit');В этом коде мы:
- Проверяем, что файл был загружен без ошибок.
- Ограничиваем типы файлов для безопасности (можно расширить список по необходимости).
- Используем встроенную функцию WordPress
wp_handle_uploadдля сохранения файла. - Сохраняем ссылку на вложение в мета-данные тикета.
Вывод вложения в карточке тикета в админке и на фронтенде
Чтобы сотрудники поддержки и пользователи видели прикрепленные файлы, добавим вывод ссылки на вложение в интерфейс тикета.
Для админки используем хук, который добавляет контент в отображение тикета:
function wptickets_show_attachment_in_admin($ticket) {
$attachment_url = get_post_meta($ticket->ID, '_wptickets_attachment_url', true);
if ($attachment_url) {
echo '<p><strong>Вложение:</strong> <a href="' . esc_url($attachment_url) . '" target="_blank">Открыть файл</a></p>';
}
}
add_action('wptickets_ticket_admin_after_content', 'wptickets_show_attachment_in_admin');Для фронтенда (если поддержка доступна для пользователей) можно добавить аналогичный вывод в шаблон тикета или использовать соответствующий хук:
function wptickets_show_attachment_in_frontend($ticket) {
$attachment_url = get_post_meta($ticket->ID, '_wptickets_attachment_url', true);
if ($attachment_url) {
echo '<p><strong>Вложение:</strong> <a href="' . esc_url($attachment_url) . '" target="_blank">Скачать файл</a></p>';
}
}
add_action('wptickets_ticket_frontend_after_content', 'wptickets_show_attachment_in_frontend');Рекомендации по безопасности и оптимизации вложений
При работе с вложениями важно учитывать несколько правил:
- Ограничение типов файлов — разрешайте только безопасные форматы (изображения, PDF, текстовые).
- Максимальный размер файла — контролируйте размер, чтобы не перегружать сервер и базу данных.
- Сканирование файлов — используйте антивирусные плагины или сервисы для проверки загружаемых файлов.
- Хранение — файлы лучше хранить вне публичных директорий, если это возможно, или использовать приватные ссылки с ограниченным доступом.
- Очистка — периодически удаляйте устаревшие вложения для экономии места.
Также можно интегрировать плагин Clearfy для оптимизации безопасности сайта и контроля загрузок.
Пример расширения: множественные вложения и галерея в тикете
Если нужно добавить возможность загружать несколько файлов, можно заменить поле загрузки на множественное и сохранить ссылки в массиве мета-данных.
function wptickets_add_multiple_attachments_field() {
echo '<p><label for="wptickets_attachments">Прикрепить файлы:</label><br><input type="file" name="wptickets_attachments[]" id="wptickets_attachments" multiple /></p>';
}
add_action('wptickets_before_ticket_form', 'wptickets_add_multiple_attachments_field');
function wptickets_handle_multiple_attachments_on_submit($ticket_id) {
if (!empty($_FILES['wptickets_attachments'])) {
$attachment_urls = [];
$files = $_FILES['wptickets_attachments'];
$allowed_types = ['image/jpeg', 'image/png', 'application/pdf', 'text/plain'];
require_once(ABSPATH . 'wp-admin/includes/file.php');
for ($i = 0; $i < count($files['name']); $i++) {
if ($files['error'][$i] === UPLOAD_ERR_OK && in_array($files['type'][$i], $allowed_types)) {
$file_array = [
'name' => $files['name'][$i],
'type' => $files['type'][$i],
'tmp_name' => $files['tmp_name'][$i],
'error' => $files['error'][$i],
'size' => $files['size'][$i],
];
$overrides = ['test_form' => false];
$uploaded_file = wp_handle_upload($file_array, $overrides);
if (!isset($uploaded_file['error'])) {
$attachment_urls[] = esc_url_raw($uploaded_file['url']);
}
}
}
if (!empty($attachment_urls)) {
update_post_meta($ticket_id, '_wptickets_attachment_urls', $attachment_urls);
}
}
}
add_action('wptickets_ticket_created', 'wptickets_handle_multiple_attachments_on_submit');Для вывода таких вложений можно сделать галерею или список ссылок:
function wptickets_show_multiple_attachments($ticket) {
$attachment_urls = get_post_meta($ticket->ID, '_wptickets_attachment_urls', true);
if ($attachment_urls && is_array($attachment_urls)) {
echo '<div class="wptickets-attachments"><strong>Вложения:</strong><ul>';
foreach ($attachment_urls as $url) {
echo '<li><a href="' . esc_url($url) . '" target="_blank">' . basename($url) . '</a></li>';
}
echo '</ul></div>';
}
}
add_action('wptickets_ticket_admin_after_content', 'wptickets_show_multiple_attachments');
add_action('wptickets_ticket_frontend_after_content', 'wptickets_show_multiple_attachments');Заключение
Добавление вложений в тикеты WPtickets расширяет функциональность системы поддержки и повышает качество обслуживания клиентов. Используя приведённые примеры кода, вы сможете быстро внедрить эту возможность на своём сайте. Не забывайте о безопасности и оптимизации, чтобы избежать проблем с производительностью и защитить пользователей.
Если вы хотите более удобный и комплексный инструмент для работы с поддержкой, обратите внимание на официальный плагин WPtickets от WPSHOP с регулярными обновлениями и поддержкой.