Как создать удобный инструмент импорта тикетов в WPtickets для WordPress

Для владельцев сайтов на 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 или хуки позволит автоматизировать импорт и последующую обработку.

Создание расписания обработки тикетов в WordPress для повышения эффективности поддержки
22.12.2025
Как создать автоматический отчет по просмотру тикетов в WPtickets для WordPress
09.04.2026
Как использовать DPDK и PHP Queue для обработки тикетов в WPtickets
09.06.2026
WooCommerce: почему не прошёл автоматический апдейт статуса заказа и как исправить
08.07.2026
Как создать удобный инструмент импорта тикетов в WPtickets для WordPress
15.02.2026