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

Почему стоит делать импорт 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, но для простых кейсов собственного кода будет достаточно.

Как создать автоматический бэкап базы данных WordPress с помощью плагинов
16.12.2025
WooCommerce: как автоматически удалять товары после отмены заказа
01.06.2026
Как удалить старые версии постов в WordPress для оптимизации базы данных
12.03.2026
Динамическая система оценок в WordPress с использованием AJAX
14.04.2026
Как добавить автоматический отзыв на сайт WordPress после покупки
12.01.2026