Импорт товаров в WooCommerce — частая задача, особенно при запуске интернет-магазина или обновлении каталога. Несмотря на множество плагинов для импорта CSV, иногда необходимо встроить процесс импорта прямо в тему или плагин, чтобы автоматизировать обновление товаров без ручного вмешательства. В этой статье рассмотрим, как реализовать автоматический импорт продуктов из CSV файла в WooCommerce программно, используя собственные функции и хуки WordPress.
Почему стоит использовать программный импорт CSV в WooCommerce
Плагины для импорта CSV удобны, но не всегда подходят для автоматизации или интеграции с внешними системами. Например, если вы получаете обновления товаров по FTP или хотите запускать импорт по крону — программный код даёт гибкость:
- Автоматический запуск импорта по расписанию
- Обработка специальных полей и кастомных метаданных
- Логирование и уведомления о результатах импорта
- Избежание конфликтов с плагинами и настройками
Далее покажу пример реализации импорта, который можно адаптировать под свои нужды.
Структура CSV и подготовка к импорту
Для примера возьмём CSV с такими колонками: sku, name, price, description, stock. SKU — уникальный идентификатор, на основе которого будем обновлять или создавать товар.
Пример строки CSV:
sku,name,price,description,stock
ABC123,Товар 1,1500,Описание товара 1,10
Файл нужно разместить на сервере, например, в папке wp-content/uploads/import/products.csv.
Функция импорта CSV в WooCommerce — подробный разбор
Создадим функцию wpset_import_products_from_csv, которая:
- Читает CSV построчно
- Проверяет, есть ли товар с таким SKU
- Обновляет или создаёт товар типа
product - Обновляет цену, описание, количество
function wpset_import_products_from_csv($filepath) {
if (!file_exists($filepath)) {
error_log('Wpset: CSV файл для импорта не найден: ' . $filepath);
return false;
}
$handle = fopen($filepath, 'r');
if (!$handle) {
error_log('Wpset: Не удалось открыть CSV файл: ' . $filepath);
return false;
}
$header = fgetcsv($handle);
if (!$header) {
error_log('Wpset: CSV файл пуст или неверный формат');
fclose($handle);
return false;
}
while (($row = fgetcsv($handle)) !== false) {
$data = array_combine($header, $row);
if (!$data || empty($data['sku'])) {
continue; // Пропускаем некорректные строки
}
$product_id = wpset_get_product_id_by_sku($data['sku']);
if ($product_id) {
// Обновляем существующий товар
$product = wc_get_product($product_id);
$product->set_name($data['name']);
$product->set_price($data['price']);
$product->set_regular_price($data['price']);
$product->set_description($data['description']);
$product->set_stock_quantity((int)$data['stock']);
$product->set_stock_status((int)$data['stock'] > 0 ? 'instock' : 'outofstock');
$product->save();
} else {
// Создаём новый товар
$new_product = new WC_Product_Simple();
$new_product->set_sku($data['sku']);
$new_product->set_name($data['name']);
$new_product->set_price($data['price']);
$new_product->set_regular_price($data['price']);
$new_product->set_description($data['description']);
$new_product->set_stock_quantity((int)$data['stock']);
$new_product->set_stock_status((int)$data['stock'] > 0 ? 'instock' : 'outofstock');
$new_product->save();
}
}
fclose($handle);
return true;
}
function wpset_get_product_id_by_sku($sku) {
global $wpdb;
$product_id = $wpdb->get_var($wpdb->prepare(
"SELECT post_id FROM {$wpdb->postmeta} WHERE meta_key='_sku' AND meta_value=%s LIMIT 1",
$sku
));
return $product_id ? (int)$product_id : 0;
}
Автоматизация запуска импорта по расписанию (WP-Cron)
Чтобы импорт запускался автоматически, например, ежедневно, используем WP-Cron. Добавим в functions.php или в плагин:
// Регистрируем событие при активации плагина или темы
register_activation_hook(__FILE__, 'wpset_activation_cron');
function wpset_activation_cron() {
if (!wp_next_scheduled('wpset_daily_import_event')) {
wp_schedule_event(time(), 'daily', 'wpset_daily_import_event');
}
}
// Удаляем расписание при деактивации
register_deactivation_hook(__FILE__, 'wpset_deactivation_cron');
function wpset_deactivation_cron() {
wp_clear_scheduled_hook('wpset_daily_import_event');
}
// Обработчик события
add_action('wpset_daily_import_event', function() {
$filepath = WP_CONTENT_DIR . '/uploads/import/products.csv';
wpset_import_products_from_csv($filepath);
});
Теперь импорт будет запускаться раз в сутки автоматически. Можно менять период и время.
Полезные советы и расширения для импорта CSV в WooCommerce
1. Валидация данных
Перед импортом полезно валидировать данные — проверять формат цены, наличие обязательных полей, корректность SKU. Это можно добавить в функцию импорта, например, с помощью регулярных выражений или фильтров.
2. Логирование результатов
Для отладки и контроля добавьте запись ошибок и успешных обновлений в отдельный лог-файл или таблицу базы данных. Это помогает быстро выявлять проблемы с импортом.
3. Расширение функционала
Можно добавить поддержку вариаций, категорий, изображений. Для загрузки изображений через URL используйте функции media_sideload_image() и связывайте вложения с продуктами.
Пример импорта изображения по URL к товару
function wpset_set_product_image_from_url($product_id, $image_url) {
require_once(ABSPATH . 'wp-admin/includes/media.php');
require_once(ABSPATH . 'wp-admin/includes/file.php');
require_once(ABSPATH . 'wp-admin/includes/image.php');
$tmp = download_url($image_url);
if (is_wp_error($tmp)) {
return false;
}
$file = array(
'name' => basename($image_url),
'tmp_name' => $tmp
);
$attachment_id = media_handle_sideload($file, $product_id);
if (is_wp_error($attachment_id)) {
@unlink($tmp);
return false;
}
set_post_thumbnail($product_id, $attachment_id);
return true;
}
Вызовите эту функцию после создания или обновления товара, чтобы добавить изображение.
Использование плагина Clearfy Pro для оптимизации импорта
Плагин Clearfy Pro поможет оптимизировать работу WooCommerce и WordPress при больших объёмах данных, отключая лишние скрипты и функции, что ускоряет импорт и снижает нагрузку на сервер.
Заключение
Автоматический импорт продуктов из CSV в WooCommerce с помощью кода — мощный инструмент в арсенале разработчика. Он позволяет гибко интегрировать внешние данные, автоматизировать обновления и контролировать процесс. Используйте предложенный пример как основу, адаптируйте под свои требования, добавляйте обработку ошибок, логирование и расширенный функционал.