Автоматизация импорта товаров в WooCommerce — частая задача для интернет-магазинов, которые хотят интегрироваться с внешними системами или поставщиками. В этой статье разберем, как настроить регулярный импорт товаров из JSON файла с минимальным участием вручную, а также рассмотрим примеры кода и полезные плагины.
Почему нужен автоматический импорт товаров из JSON
Многие поставщики предоставляют каталог товаров в формате JSON, который содержит актуальную информацию о товарах — название, описание, цену, наличие, атрибуты и изображения. Ручной импорт или обновление таких данных — неэффективно и чревато ошибками.
Автоматизация помогает:
- Регулярно обновлять ассортимент и цены без участия менеджера.
- Сократить время на обработку большого объема товаров.
- Избежать дублирования и ошибок при вводе данных.
Плагин для импорта JSON в WooCommerce
Для начала можно использовать готовые решения. Например, WP Export Import — плагин, который поддерживает импорт товаров из JSON и CSV с настройкой расписания.
Этот плагин позволяет:
- Настроить привязку полей JSON к полям товара WooCommerce.
- Импортировать изображения по URL и автоматически прикреплять к товарам.
- Обновлять товары по SKU.
- Запускать импорт по расписанию через CRON.
Если же нужна кастомизация, можно написать собственный скрипт импорта.
Пример кастомного импорта товаров из JSON — базовый скрипт
Рассмотрим пример функции, которая загружает JSON-файл с удаленного сервера и импортирует товары в WooCommerce. Важно: перед использованием на боевом сайте протестируйте код в тестовой среде.
function wpdevelop_import_products_from_json($json_url) {
$response = wp_remote_get($json_url);
if (is_wp_error($response)) {
error_log('Ошибка загрузки JSON: ' . $response->get_error_message());
return;
}
$body = wp_remote_retrieve_body($response);
$products = json_decode($body, true);
if (!$products) {
error_log('Ошибка декодирования JSON');
return;
}
foreach ($products as $item) {
// Проверка обязательных полей
if (empty($item['sku']) || empty($item['name'])) continue;
$product_id = wc_get_product_id_by_sku($item['sku']);
if ($product_id) {
$product = wc_get_product($product_id);
} else {
$product = new WC_Product_Simple();
$product->set_sku($item['sku']);
}
$product->set_name($item['name']);
$product->set_regular_price($item['price']);
$product->set_description($item['description'] ?? '');
$product->set_stock_quantity($item['stock'] ?? 0);
$product->set_manage_stock(true);
$product->save();
// Импорт изображения
if (!empty($item['image_url'])) {
$attachment_id = wpdevelop_import_image($item['image_url'], $product->get_id());
if ($attachment_id) {
set_post_thumbnail($product->get_id(), $attachment_id);
}
}
}
}
function wpdevelop_import_image($image_url, $post_id) {
require_once(ABSPATH . 'wp-admin/includes/image.php');
require_once(ABSPATH . 'wp-admin/includes/file.php');
require_once(ABSPATH . 'wp-admin/includes/media.php');
$tmp = download_url($image_url);
if (is_wp_error($tmp)) {
return false;
}
$file_array = array(
'name' => basename($image_url),
'tmp_name' => $tmp
);
$id = media_handle_sideload($file_array, $post_id);
if (is_wp_error($id)) {
@unlink($tmp);
return false;
}
return $id;
}Этот код загружает JSON, проходит по списку товаров, создает или обновляет товары по SKU, устанавливает название, цену, описание и количество на складе, а также загружает изображение и прикрепляет его как миниатюру.
Как запускать импорт регулярно — использование WP-Cron
Для автоматизации импорта создадим задачу в WP-Cron, которая будет запускать функцию импорта по расписанию.
add_action('wpdevelop_scheduled_product_import', 'wpdevelop_run_product_import');
function wpdevelop_run_product_import() {
$json_url = 'https://example.com/products.json';
wpdevelop_import_products_from_json($json_url);
}
if (!wp_next_scheduled('wpdevelop_scheduled_product_import')) {
wp_schedule_event(time(), 'hourly', 'wpdevelop_scheduled_product_import');
}В этом примере импорт товаров из JSON будет запускаться ежечасно. Если нужно изменить интервал, можно создать собственное расписание через фильтр cron_schedules.
Добавление собственного интервала в WP-Cron
add_filter('cron_schedules', 'wpdevelop_add_custom_cron_interval');
function wpdevelop_add_custom_cron_interval($schedules) {
$schedules['every_five_minutes'] = array(
'interval' => 300, // 5 минут в секундах
'display' => __('Каждые 5 минут')
);
return $schedules;
}После этого можно заменить 'hourly' на 'every_five_minutes' в вызове wp_schedule_event.
Обработка ошибок и логирование
При автоматическом импорте важно отслеживать ошибки. В примерах выше мы используем error_log, но для удобства можно подключить плагин Clearfy Pro, который расширяет возможности логирования и оптимизации.
Также рекомендуем:
- Писать результаты импорта в отдельный лог-файл.
- Отправлять уведомления на email при возникновении критических ошибок.
Советы по оптимизации импорта
При большом количестве товаров импорт может занимать много ресурсов и времени.
- Разбивайте импорт на части, чтобы избежать таймаутов.
- Используйте транзакции и батчи, если работаете с БД напрямую.
- Кэшируйте данные, если источник JSON не меняется часто.
- Обрабатывайте только измененные товары, сравнивая хэш или дату обновления.
Заключение
Автоматический импорт товаров из JSON в WooCommerce — эффективный способ поддерживать актуальный каталог без ручного труда. Используйте готовые плагины для быстрого старта или пишите свой скрипт с учетом специфики вашего каталога и поставщика.
Подробности и готовые решения ищите на WP Export Import и других инструментах от WPShop.