Зачем нужен автоматический импорт пользователей из 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.