Как добавить вложения в тикеты WPtickets: подробное руководство

Плагин 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 с регулярными обновлениями и поддержкой.

Создание расписания обработки тикетов в WordPress для повышения эффективности поддержки
22.12.2025
Отладка ошибок оплаты и обновление статуса заказов в WooCommerce
24.06.2026
Как создать автоматический импорт тикетов в WordPress
23.03.2026
Как создать автоприкрепление файлов к тикетам в WPtickets
03.01.2026
WP Tickets: как использовать хук для добавления поля в форму создания тикета
10.05.2026