В современных интернет-магазинах и каталогах часто возникает необходимость автоматического импорта товаров или данных из файлов YML (Yandex Market Language). В этой статье мы подробно разберём, как настроить автоматический импорт из YML в WordPress, используя примеры кода и рекомендации. Это позволит поддерживать актуальность контента без дополнительного ручного труда.
Что такое YML и зачем нужен импорт в WordPress
YML — это специализированный XML-формат, разработанный для удобного обмена и передачи товарных данных между системами. Наиболее часто используется в России для выгрузки товаров в Яндекс.Маркет, а также для обмена данными с другими маркетплейсами и системами учёта.
Импорт данных из YML в WordPress позволяет:
- Автоматически обновлять ассортимент товаров;
- Сохранять структуру категорий и атрибутов;
- Обновлять цены и наличие;
- Экономить время контент-менеджеров.
Для этого нужно создать скрипт, который будет разбирать YML-файл, преобразовывать данные и создавать/обновлять записи в WordPress.
Обработка YML файла: парсинг и разбор данных
Для работы с YML в PHP удобно использовать встроенный класс SimpleXMLElement. Он позволяет легко парсить XML и получать доступ к элементам.
Пример базового парсинга YML:
function wpcore_parse_yml($file_path) {
if (!file_exists($file_path)) {
return false;
}
$xml_content = file_get_contents($file_path);
$xml = simplexml_load_string($xml_content);
if (!$xml) {
return false;
}
$offers = [];
foreach ($xml->shop->offers->offer as $offer) {
$offers[] = [
'id' => (string)$offer['id'],
'name' => (string)$offer->name,
'price' => (float)$offer->price,
'categoryId' => (string)$offer->categoryId,
'description' => (string)$offer->description
];
}
return $offers;
}Здесь функция принимает путь к YML файлу, загружает и парсит его, возвращая массив с офферами (товарами).
Обработка категорий
Категории в YML тоже представлены в отдельном блоке. Для корректной структуры в WordPress нужно их обработать и создать соответствующие термины (например, категории таксономии "product_cat").
function wpcore_import_categories($xml) {
foreach ($xml->shop->categories->category as $category) {
$cat_id = (int)$category['id'];
$parent_id = (int)$category['parentId'];
$name = (string)$category;
$args = [
'slug' => 'category-' . $cat_id,
'parent' => 0,
'description' => '',
];
if ($parent_id > 0) {
$parent_term = get_term_by('slug', 'category-' . $parent_id, 'product_cat');
if ($parent_term) {
$args['parent'] = $parent_term->term_id;
}
}
if (!term_exists($name, 'product_cat')) {
wp_insert_term($name, 'product_cat', $args);
}
}
}Эту функцию нужно вызывать перед импортом товаров, чтобы категории были готовы.
Создание и обновление товаров в WordPress
В WordPress товары обычно реализованы как кастомные типы записей, например, product для WooCommerce. Для создания записи используем функцию wp_insert_post. При повторном импорте нужно проверять наличие товара по уникальному ID из YML и обновлять данные.
function wpcore_import_offers($offers) {
foreach ($offers as $offer) {
$existing = get_posts([
'post_type' => 'product',
'meta_key' => 'wpcore_yml_id',
'meta_value' => $offer['id'],
'posts_per_page' => 1
]);
$post_data = [
'post_title' => $offer['name'],
'post_content' => $offer['description'],
'post_status' => 'publish',
'post_type' => 'product'
];
if ($existing) {
$post_data['ID'] = $existing[0]->ID;
$post_id = wp_update_post($post_data);
} else {
$post_id = wp_insert_post($post_data);
add_post_meta($post_id, 'wpcore_yml_id', $offer['id'], true);
}
if ($post_id) {
update_post_meta($post_id, '_price', $offer['price']);
// Добавляем категорию товара
wp_set_object_terms($post_id, intval($offer['categoryId']), 'product_cat');
}
}
}Такой подход позволяет поддерживать товары в актуальном состоянии.
Автоматизация процесса с помощью WP-Cron
Чтобы импорт происходил регулярно, настроим WP-Cron — внутренний планировщик заданий WordPress.
Добавим задачу в файл функций темы или плагина:
add_action('wpcore_yml_import_event', 'wpcore_yml_import_cron');
function wpcore_yml_import_cron() {
$file_path = WP_CONTENT_DIR . '/uploads/import.yml';
$xml = simplexml_load_file($file_path);
if (!$xml) return;
wpcore_import_categories($xml);
$offers = wpcore_parse_yml($file_path);
if ($offers) {
wpcore_import_offers($offers);
}
}
if (!wp_next_scheduled('wpcore_yml_import_event')) {
wp_schedule_event(time(), 'hourly', 'wpcore_yml_import_event');
}Этот код создаст задачу, которая будет запускать импорт каждый час.
Готовые плагины для импорта YML
Если хочется упростить задачу, можно использовать готовые решения:
- YML Importer — плагин с поддержкой автоматического импорта и обновления товаров из YML;
- Clearfy Pro — оптимизатор с расширенными возможностями по управлению импортом;
- WooCommerce Product CSV Import Suite — универсальный инструмент, который можно адаптировать под YML через конвертацию.
Использование плагинов ускоряет процесс, но понимание основ поможет гибко настроить импорт под любые задачи.
Отладка и рекомендации по безопасности
При создании автоматического импорта важно:
- Обрабатывать ошибки парсинга и отсутствия файла;
- Использовать nonce и права доступа для запуска импорта;
- Резервировать базу перед массовым обновлением товаров;
- Проверять корректность данных перед сохранением;
- Логировать процесс для быстрой диагностики.
Правильный подход к импорту YML значительно упростит поддержку сайта и повысит качество данных.