Почему стоит делать импорт CSV без плагинов
Автоматический импорт данных из CSV — частая задача при работе с WordPress, особенно когда нужно регулярно загружать большое количество товаров, постов или пользовательских данных. Многие начинают искать готовые решения в виде плагинов, но нередко они оказываются либо слишком тяжелыми, либо не дают полной гибкости. Поэтому разумно написать собственный скрипт, который будет работать именно под ваши задачи, не нагружая систему.
В этой статье я подробно расскажу, как реализовать импорт CSV в WordPress программно, используя возможности ядра и минимальный сторонний код. Мы рассмотрим разбор CSV, создание кастомных записей, обновление метаданных и обработку ошибок. Это позволит вам полностью контролировать процесс и легко интегрировать импорт в существующий функционал.
Также в конце будет пример кода, который можно сразу адаптировать под свои нужды.
Структура CSV и подготовка данных
Прежде чем писать код, важно понимать структуру ваших CSV-файлов. Чаще всего данные приходят с заголовками столбцов, например: post_title, post_content, meta_color, meta_price. Если вы импортируете товары, возможно, понадобятся поля для цены, описания, наличия на складе и т.д.
Для демонстрации возьмём простой CSV с такими столбцами:
post_title— заголовок поста или товара;post_content— описание;meta_color— цвет товара, метаполе;meta_price— цена, метаполе.
Важно: данные должны быть в кодировке UTF-8, чтобы избежать проблем с кириллицей.
Разбор CSV и создание постов в WordPress
Для разбора CSV используем стандартные функции PHP — fopen и fgetcsv. Дальше по каждой строке создадим или обновим пост с помощью функции wp_insert_post, а метаданные добавим через update_post_meta.
Ниже пример функции, которую можно добавить в файл functions.php темы или в отдельный файл плагина:
function wpbegin_import_csv_to_posts($csv_file_path) {
if (!file_exists($csv_file_path) || !is_readable($csv_file_path)) {
return new WP_Error('file_error', 'CSV файл не найден или недоступен');
}
$header = null;
if (($handle = fopen($csv_file_path, 'r')) !== false) {
while (($row = fgetcsv($handle, 1000, ',')) !== false) {
if (!$header) {
$header = $row;
continue;
}
$data = array_combine($header, $row);
if (empty($data['post_title'])) {
continue; // пропускаем, если нет заголовка
}
$post_data = array(
'post_title' => sanitize_text_field($data['post_title']),
'post_content' => sanitize_textarea_field($data['post_content']),
'post_status' => 'publish',
'post_type' => 'post',
);
$post_id = wp_insert_post($post_data);
if (is_wp_error($post_id)) {
continue; // ошибка записи
}
if (!empty($data['meta_color'])) {
update_post_meta($post_id, 'color', sanitize_text_field($data['meta_color']));
}
if (!empty($data['meta_price'])) {
update_post_meta($post_id, 'price', floatval($data['meta_price']));
}
}
fclose($handle);
}
}
Эта функция открывает CSV, считывает заголовок, затем построчно обрабатывает данные, создаёт новые посты и добавляет метаданные. Важно использовать функции санитизации, чтобы избежать проблем с безопасностью.
Добавление поддержки кастомных типов записей и таксономий
Если у вас в проекте используются кастомные типы записей, например product для товаров, можете легко изменить функцию, передав тип в параметрах:
function wpbegin_import_csv_to_custom_posts($csv_file_path, $post_type = 'post') {
// аналогичный код, только в массив $post_data добавить 'post_type' => $post_type
}
Также можно добавить поддержку таксономий — категорий, меток и пользовательских таксономий. Для этого используйте функцию wp_set_object_terms. Например, если в CSV есть столбец category с перечислением категорий через запятую:
if (!empty($data['category'])) {
$categories = array_map('trim', explode(',', $data['category']));
wp_set_object_terms($post_id, $categories, 'category');
}
<Так вы сможете динамически привязывать записи к нужным рубрикам во время импорта.
Автоматизация запуска импорта и обработка ошибок
Для автоматического импорта можно использовать WP-Cron, вызов функции при загрузке страницы или отдельный скрипт, запускаемый по Cron на сервере.
Пример регистрации задачи с WP-Cron:
if (!wp_next_scheduled('wpbegin_csv_import_event')) {
wp_schedule_event(time(), 'hourly', 'wpbegin_csv_import_event');
}
add_action('wpbegin_csv_import_event', function() {
$csv_path = get_template_directory() . '/data/import.csv';
wpbegin_import_csv_to_posts($csv_path);
});
Не забудьте добавить логику ведения журнала ошибок, чтобы понимать успешность операции и возможные сбои. Например, можно сохранять информативные сообщения в отдельный лог-файл или в таблицу в базе.
Заключение по импорту CSV без плагинов
В результате вы получаете гибкий и легковесный механизм импорта, который легко подстроить под любые задачи. Такой подход лучше, чем использование универсальных плагинов, которые могут быть избыточными и менее производительными.
Если вам нужна более продвинутая оптимизация или интеграция с WooCommerce, рассмотрите возможность использования специализированных плагинов из wpshop.ru, но для простых кейсов собственного кода будет достаточно.