Как создать автоматический импорт пользователей из CSV в WordPress

Зачем нужен автоматический импорт пользователей из CSV

При работе с крупными проектами на WordPress часто возникает необходимость массовой загрузки пользователей. Это может быть миграция с другого сайта, импорт клиентов из CRM или массовое добавление участников для обучающих платформ. Ручной ввод данных неудобен и занимает много времени, поэтому автоматизация процесса с помощью импорта из CSV-файла — идеальное решение.

CSV (Comma-Separated Values) — простой формат текстового файла, который легко формируется и читается. В нем обычно содержатся поля: имя, email, роль и другие параметры пользователя. В этой статье расскажу, как создать автоматический импорт пользователей из CSV с помощью кастомного плагина и приведу пример кода.

Подготовка CSV-файла для импорта пользователей WordPress

Перед импортом важно правильно подготовить CSV-файл. Вот минимальный набор колонок, который понадобится:

  • user_login — логин пользователя (обязательное поле)
  • user_email — email пользователя (обязательное поле)
  • user_pass — пароль (если не указан, будет сгенерирован)
  • first_name — имя (необязательно)
  • last_name — фамилия (необязательно)
  • role — роль пользователя (subscriber, editor и т.п.)

Файл должен быть в кодировке UTF-8 без BOM. Например:

user_login,user_email,user_pass,first_name,last_name,role
ivanov,ivanov@example.com,123456,Ivan,Ivanov,subscriber
petrov,petrov@example.com,,Petr,Petrov,editor

Создание плагина для автоматического импорта пользователей из CSV

Для автоматизации импортируем CSV через админку WordPress. Создадим простой плагин с формой загрузки файла и обработкой данных.

Структура плагина

Создайте папку wpdevelop-import-users и файл wpdevelop-import-users.php с таким содержимым:

<?php
/**
 * Plugin Name: WPDevelop Import Users
 * Description: Автоматический импорт пользователей из CSV файла.
 * Version: 1.0
 * Author: WPDevelop
 */

// Добавляем меню в админку
add_action('admin_menu', 'wpdevelop_import_users_menu');
function wpdevelop_import_users_menu() {
    add_users_page('Импорт пользователей CSV', 'Импорт CSV', 'manage_options', 'wpdevelop-import-users', 'wpdevelop_import_users_page');
}

// Страница с формой загрузки
function wpdevelop_import_users_page() {
    if (!current_user_can('manage_options')) {
        wp_die('Доступ запрещен');
    }

    echo '<h1>Импорт пользователей из CSV</h1>';

    if (isset($_POST['wpdevelop_import_submit']) && check_admin_referer('wpdevelop_import_users_nonce')) {
        if (!empty($_FILES['csv_file']['tmp_name'])) {
            $result = wpdevelop_import_users_handle_csv($_FILES['csv_file']['tmp_name']);
            echo '<div class="updated notice"><p>Импортировано пользователей: ' . intval($result['imported']) . '</p></div>';
            if (!empty($result['errors'])) {
                echo '<div class="error notice"><p>Ошибки при импорте:</p><ul>';
                foreach ($result['errors'] as $error) {
                    echo '<li>' . esc_html($error) . '</li>';
                }
                echo '</ul></div>';
            }
        } else {
            echo '<div class="error notice"><p>Пожалуйста, загрузите CSV файл.</p></div>';
        }
    }

    echo '<form method="post" enctype="multipart/form-data">';
    wp_nonce_field('wpdevelop_import_users_nonce');
    echo '<input type="file" name="csv_file" accept=".csv" required><br><br>';
    echo '<input type="submit" name="wpdevelop_import_submit" class="button button-primary" value="Импортировать">';
    echo '</form>';
}

// Функция обработки CSV и добавления пользователей
function wpdevelop_import_users_handle_csv($file_path) {
    $imported = 0;
    $errors = [];

    if (($handle = fopen($file_path, 'r')) !== false) {
        $header = fgetcsv($handle, 1000, ',');
        $header_map = array_flip($header);

        while (($data = fgetcsv($handle, 1000, ',')) !== false) {
            $user_login = isset($header_map['user_login']) ? trim($data[$header_map['user_login']]) : '';
            $user_email = isset($header_map['user_email']) ? trim($data[$header_map['user_email']]) : '';
            $user_pass = isset($header_map['user_pass']) ? trim($data[$header_map['user_pass']]) : wp_generate_password();
            $first_name = isset($header_map['first_name']) ? trim($data[$header_map['first_name']]) : '';
            $last_name = isset($header_map['last_name']) ? trim($data[$header_map['last_name']]) : '';
            $role = isset($header_map['role']) ? trim($data[$header_map['role']]) : 'subscriber';

            if (empty($user_login) || empty($user_email)) {
                $errors[] = "Пропущены обязательные поля user_login или user_email для строки с логином '$user_login'.";
                continue;
            }

            if (username_exists($user_login) || email_exists($user_email)) {
                $errors[] = "Пользователь с логином '$user_login' или email '$user_email' уже существует.";
                continue;
            }

            $userdata = [
                'user_login' => $user_login,
                'user_email' => $user_email,
                'user_pass' => $user_pass,
                'first_name' => $first_name,
                'last_name' => $last_name,
                'role' => $role,
            ];

            $user_id = wp_insert_user($userdata);

            if (is_wp_error($user_id)) {
                $errors[] = "Ошибка при добавлении пользователя '$user_login': " . $user_id->get_error_message();
            } else {
                $imported++;
            }
        }
        fclose($handle);
    } else {
        $errors[] = 'Не удалось открыть CSV файл.';
    }

    return ['imported' => $imported, 'errors' => $errors];
}

Рекомендации по безопасности и производительности при импорте

Импорт пользователей — потенциально ресурсоёмкая операция, особенно на больших файлах. Чтобы избежать перегрузок сервера, стоит разбивать файл на части или использовать WP-CLI для командной строки при больших объемах.

Также важно проверять данные на корректность и уникальность, чтобы не создавать дубли. В нашем примере плагина это реализовано через проверки username_exists() и email_exists().

Не забудьте ограничить доступ к странице импорта только администраторам с правами manage_options, чтобы избежать несанкционированного добавления пользователей.

Альтернативные плагины для импорта пользователей

Если хочется готовое решение без программирования, можно использовать популярные плагины:

  • Import Users from CSV — бесплатный и удобный плагин с возможностью маппинга полей и отправкой уведомлений пользователям.
  • Clearfy Pro — расширенный плагин оптимизации и управления WordPress с возможностями для работы с пользователями.

Но для уникальных требований проще и лучше написать свой скрипт, как в примере выше.

Заключение

Автоматический импорт пользователей из CSV в WordPress — частая задача для разработчиков и администраторов. Создав простой плагин, вы сможете быстро и безопасно загружать большие списки пользователей с нужными полями и ролями. Это сэкономит время и устранит ошибки ручного ввода.

Используйте приведенный пример как основу и расширяйте функциональность под свои задачи — например, добавьте обработку дополнительных метаполей, отправку email уведомлений или интеграцию с CRM.

Как создать автоматический кеш для REST API в WordPress
11.01.2026
Как удалить или изменить slug кастомного типа записи в WordPress без потери данных
03.03.2026
Как использовать хуки для изменения функциональности WordPress
15.04.2026
Как отключить Emoji в WordPress без плагинов для ускорения сайта
23.02.2026
Как создать автоматический импорт данных из Excel в WordPress
19.03.2026