Для владельцев сайтов на WordPress с установленным плагином WPtickets часто возникает задача массового импорта тикетов из внешних источников: CSV-файлов, CRM-систем или других сервисов поддержки. В этой статье мы подробно разберём, как создать удобный и гибкий инструмент импорта тикетов, который позволит автоматизировать этот процесс, сэкономить время и избежать ошибок.
Почему импорт тикетов важен и какие задачи он решает
Если ваш сайт только переходит на WPtickets или вы хотите объединить историю обращений из других систем, ручное создание тикетов через админку слишком трудоёмко и неэффективно. Импорт позволяет:
- Массово перенести существующие обращения без потери данных.
- Обеспечить единый интерфейс поддержки для пользователей.
- Автоматизировать процесс обновления базы тикетов.
- Сократить время на рутинные операции по созданию тикетов.
Однако из коробки в WPtickets нет функционала импорта, поэтому мы создадим его самостоятельно с нуля, используя WordPress API и возможности самого плагина.
Обзор структуры таблиц WPtickets и подготовка данных
WPtickets хранит тикеты в кастомных таблицах базы данных, а также использует кастомные типы записей (custom post types) и метаполя. Для успешного импорта необходимо понять структуру:
- Основная таблица тикетов — wp_wptickets_tickets (название может отличаться, проверьте префикс).
- Дополнительные метаданные тикета хранятся в wp_postmeta или отдельных таблицах плагина.
- Каждый тикет связан с пользователем (клиентом) и автором (агентом поддержки).
Перед импортом подготовьте CSV или JSON файл с колонками: заголовок тикета, описание, статус, приоритет, email клиента, дата создания и другие необходимые поля. Очень важно, чтобы данные были корректно валидированы.
Создаем простую форму загрузки файла импорта
Для удобства добавим в админку WPtickets новую страницу с формой загрузки файла. Используем WordPress Settings API и nonce для безопасности.
function wptickets_import_admin_menu() {
add_submenu_page('edit.php?post_type=wpticket', 'Импорт тикетов', 'Импорт тикетов', 'manage_options', 'wptickets-import', 'wptickets_import_page');
}
add_action('admin_menu', 'wptickets_import_admin_menu');
function wptickets_import_page() {
if (isset($_POST['wptickets_import_nonce']) && wp_verify_nonce($_POST['wptickets_import_nonce'], 'wptickets_import_action')) {
wptickets_handle_import($_FILES['import_file']);
}
?>
<h2>Импорт тикетов из CSV</h2>
<form method="post" enctype="multipart/form-data">
<?php wp_nonce_field('wptickets_import_action', 'wptickets_import_nonce'); ?>
<input type="file" name="import_file" accept=".csv" required />
<input type="submit" value="Импортировать" class="button button-primary" />
</form>
<?php
}Эта форма позволит администратору загрузить CSV файл с тикетами.
Обработка и импорт данных из CSV с проверками
Теперь разберём функцию wptickets_handle_import, которая будет читать CSV, валидировать данные и создавать тикеты через API WPtickets.
function wptickets_handle_import($file) {
if ($file['error'] !== UPLOAD_ERR_OK) {
echo '<div class="error notice">Ошибка загрузки файла</div>';
return;
}
$handle = fopen($file['tmp_name'], 'r');
if (!$handle) {
echo '<div class="error notice">Не удалось открыть файл</div>';
return;
}
$row = 0;
$imported = 0;
while (($data = fgetcsv($handle, 1000, ',')) !== FALSE) {
$row++;
if ($row === 1) continue; // пропускаем заголовок
list($title, $description, $status, $priority, $client_email, $created_at) = $data;
if (empty($title) || empty($client_email)) {
echo "<div class=\"error notice\">Строка $row: отсутствуют обязательные поля</div>";
continue;
}
$user = get_user_by('email', $client_email);
if (!$user) {
echo "<div class=\"error notice\">Строка $row: пользователь с email $client_email не найден</div>";
continue;
}
$ticket_id = wptickets_import_create_ticket($title, $description, $status, $priority, $user->ID, $created_at);
if ($ticket_id) {
$imported++;
} else {
echo "<div class=\"error notice\">Строка $row: ошибка при создании тикета</div>";
}
}
fclose($handle);
echo "<div class=\"updated notice\">Импортировано тикетов: $imported</div>";
}
function wptickets_import_create_ticket($title, $description, $status, $priority, $user_id, $created_at) {
$postarr = array(
'post_title' => wp_strip_all_tags($title),
'post_content' => $description,
'post_status' => 'publish',
'post_type' => 'wpticket',
'post_author' => $user_id,
'post_date' => $created_at,
);
$post_id = wp_insert_post($postarr);
if (is_wp_error($post_id) || !$post_id) {
return false;
}
update_post_meta($post_id, '_wpticket_status', sanitize_text_field($status));
update_post_meta($post_id, '_wpticket_priority', sanitize_text_field($priority));
return $post_id;
}Функция wptickets_import_create_ticket создаёт тикет как кастомный пост с нужными метаполями. Следует адаптировать названия метаполей под используемую версию WPtickets.
Дополнительные советы по улучшению импорта и безопасности
Для повышения надёжности и удобства:
- Добавьте логирование ошибок для отладки.
- Реализуйте проверку дубликатов по заголовку или email.
- Используйте транзакции базы данных или отложенный импорт (через WP Cron) для больших файлов.
- Добавьте поддержку других форматов, например JSON или XML.
- Обеспечьте безопасность через проверку прав пользователя и nonce.
Плагины для расширения функционала поддержки и импорта
Если хочется готовое решение, обратите внимание на интеграционные плагины или сервисы:
- WPtickets — основной плагин для поддержки клиентов.
- WPRemark — для расширенного управления тикетами и комментариями.
- Плагины для импорта CSV, например WP All Import, с возможностью кастомизации.
Интеграция с WPtickets через REST API или хуки позволит автоматизировать импорт и последующую обработку.