Импорт данных из CSV — частая задача при работе с WordPress, особенно когда нужно загружать сложные данные для кастомных типов записей или метаполей с вложенной структурой. В этом материале я расскажу, как создать автоматический импорт CSV с поддержкой полей сложной структуры, чтобы вы могли легко адаптировать это под свои задачи.
Почему стандартный импорт CSV не всегда подходит
В стандартных плагинах для импорта CSV, таких как WP All Import или встроенные решения, часто предусмотрена только простая структура данных: одна строка — одна запись, где поля — это простые значения. Но что делать, если у вас есть сложные поля — массивы, вложенные объекты, повторяющиеся группы полей?
Например, у вас есть кастомный тип записи product с метаполями, где одно из полей — список характеристик, каждая характеристика — массив с названием и значением. Стандартный импорт просто не сможет корректно разобрать и записать такую структуру.
Поэтому нам нужно написать свой механизм разбора CSV и сохранения сложных данных в метаполя WordPress.
Требования к CSV и его разбор
Для начала опишем структуру CSV. Предположим, что у вас есть следующие колонки:
- product_name — название продукта
- price — цена
- features — характеристики, записанные в формате JSON
Пример значения в колонке features:
[{"name":"Вес","value":"1 кг"},{"name":"Цвет","value":"Красный"}]Использование JSON в CSV позволяет передавать сложные вложенные структуры.
Мы напишем функцию, которая будет читать файл, парсить каждую строку, декодировать JSON поля и создавать/обновлять записи в WordPress.
Пример кода для автоматического импорта CSV с поддержкой сложных полей
Ниже пример функции с префиксом wpcodex_, которая импортирует данные из CSV и сохраняет их в кастомный тип записи product с метаполями:
function wpcodex_import_products_from_csv($csv_file_path) {
if (!file_exists($csv_file_path)) {
return new WP_Error('file_not_found', 'CSV файл не найден');
}
if (($handle = fopen($csv_file_path, 'r')) === false) {
return new WP_Error('file_open_error', 'Не удалось открыть CSV файл');
}
$header = fgetcsv($handle, 0, ',');
if (!$header) {
fclose($handle);
return new WP_Error('empty_file', 'CSV файл пустой или неверный формат');
}
while (($row = fgetcsv($handle, 0, ',')) !== false) {
$data = array_combine($header, $row);
// Создаем или обновляем продукт
$post_data = array(
'post_title' => sanitize_text_field($data['product_name']),
'post_type' => 'product',
'post_status' => 'publish'
);
// Пытаемся найти уже существующий пост по названию
$existing = get_page_by_title($post_data['post_title'], OBJECT, 'product');
if ($existing) {
$post_data['ID'] = $existing->ID;
wp_update_post($post_data);
$post_id = $existing->ID;
} else {
$post_id = wp_insert_post($post_data);
}
if (is_wp_error($post_id)) {
continue; // ошибка создания поста
}
// Сохраняем цену
if (isset($data['price'])) {
update_post_meta($post_id, 'price', floatval($data['price']));
}
// Обрабатываем характеристики (features) из JSON
if (!empty($data['features'])) {
$features = json_decode($data['features'], true);
if (json_last_error() === JSON_ERROR_NONE && is_array($features)) {
update_post_meta($post_id, 'features', $features);
}
}
}
fclose($handle);
return true;
}В этом примере мы:
- Открываем CSV файл и читаем заголовки и строки
- Создаем или обновляем записи типа
productпо названию - Сохраняем цену как метаполе
- Декодируем JSON строку из поля
featuresи сохраняем как массив в метаполе
Автоматизация запуска импорта по расписанию
Чтобы импорт происходил автоматически, можно настроить WP-Cron задачу.
Добавьте следующий код, чтобы запускать импорт, например, каждый час:
function wpcodex_schedule_import() {
if (!wp_next_scheduled('wpcodex_hourly_import_event')) {
wp_schedule_event(time(), 'hourly', 'wpcodex_hourly_import_event');
}
}
add_action('wp', 'wpcodex_schedule_import');
add_action('wpcodex_hourly_import_event', 'wpcodex_run_import_task');
function wpcodex_run_import_task() {
$csv_path = WP_CONTENT_DIR . '/uploads/products.csv'; // путь к вашему CSV
wpcodex_import_products_from_csv($csv_path);
}Такой подход позволит вам просто заливать новый CSV в указанную папку, и новые данные будут автоматически импортированы.
Плагины для упрощения импорта и расширения функционала
Если хочется готового решения с GUI и поддержкой сложных структур, рекомендую обратить внимание на:
- WP All Import — мощный плагин с поддержкой кастомных типов, полей и сложных данных, включая JSON-поля
- Clearfy Pro — плагин для оптимизации и управления WordPress, в том числе позволяет расширить возможности импорта и очистки данных
Однако, если вы хотите именно тонко контролировать процесс, собственный код — лучший способ.
Обработка ошибок и валидация данных при импорте
В реальных проектах важно предусмотреть обработку ошибок:
- Проверять наличие обязательных полей
- Валидировать формат JSON
- Логировать ошибки импорта для последующего анализа
Добавьте внутри цикла условия для проверки и записи ошибок, например, в отдельный лог-файл или в специальную таблицу.
Это позволит быстро выявлять проблемы с данными и корректировать CSV без остановки импорта.
Заключение
Создание автоматического импорта CSV с поддержкой сложных полей в WordPress — задача, решаемая с помощью сочетания правильной структуры данных, аккуратного парсинга и сохранения в метаполя. Использование JSON для вложенных данных — удобный и надежный способ передать сложную структуру в CSV.
При необходимости можно автоматизировать процесс через WP-Cron и расширять функционал с помощью проверенных плагинов, например, WP All Import и Clearfy Pro.
Такой подход позволит вам легко интегрировать внешние данные в WordPress и поддерживать их актуальность без лишних усилий.