Ниже представлен пример кода генерации YML файла на PHP по упрошенной схеме для выгрузки на Яндекс.Маркет.
Предполагается что у магазина в БД есть две таблицы – товары и категории, цены хранятся в таблице товаров. Для доступа к БД используется PDO.
В коде нет информации о доставке, данных о производителях и т.д. Полное описание на yandex.ru
<?php
// Подключение к БД
$dbh = new PDO('mysql:dbname=db_name;host=localhost', 'логин', 'пароль');
$out = '<?xml version="1.0" encoding="UTF-8"?>' . "\r\n";
$out .= '<yml_catalog date="' . date('Y-m-d H:i') . '">' . "\r\n";
$out .= '<shop>' . "\r\n";
// Короткое название магазина, должно содержать не более 20 символов
$out .= '<name>Название магазина</name>' . "\r\n";
// Полное наименование компании, владеющей магазином
$out .= '<company>ООО «Пупкин»</company>' . "\r\n";
// URL главной страницы магазина
$out .= '<url>https://example.com/</url>' . "\r\n";
// Список курсов валют магазина
$out .= '<currencies>' . "\r\n";
$out .= '<currency id="RUR" rate="1"/>' . "\r\n";
$out .= '</currencies>' . "\r\n";
// Список категорий магазина:
// id - ID категории
// parent - ID родительской категории
// name - Название категории
$sth = $dbh->prepare("SELECT `id`, `parent`, `name` FROM `category`");
$sth->execute();
$category = $sth->fetchAll(PDO::FETCH_ASSOC);
$out .= '<categories>' . "\r\n";
foreach ($category as $row) {
if (empty($row['parent'])) {
$out .= '<category id="' . $row['id'] . '">' . $row['name'] . '</category>' . "\r\n";
} else {
$out .= '<category id="' . $row['id'] . '" parentId="' . $row['parent'] . '">' . $row['name'] . '</category>' . "\r\n";
}
}
$out .= '</categories>' . "\r\n";
// Вывод товаров:
$sth = $dbh->prepare("SELECT * FROM `prods`");
$sth->execute();
$prods = $sth->fetchAll(PDO::FETCH_ASSOC);
$out .= '<offers>' . "\r\n";
foreach ($prods as $row) {
$out .= '<offer id="' . $row['id'] . '">' . "\r\n";
// URL страницы товара на сайте магазина
$out .= '<url>https://example.com/prod/' . $row['id'] . '.html</url>' . "\r\n";
// Цена, предполагается что в БД хранится цена и цена со скидкой
if (!empty($row['price_sale'])) {
$out .= '<price>' . $row['price_sale'] . '</price>' . "\r\n";
$out .= '<oldprice>' . $row['price'] . '</oldprice>' . "\r\n";
} else {
$out .= '<price>' . $row['price'] . '</price>' . "\r\n";
}
// Валюта товара
$out .= '<currencyId>RUR</currencyId>' . "\r\n";
// ID категории
$out .= '<categoryId>' . $row['category'] . '</categoryId>' . "\r\n";
// Изображения товара, до 10 ссылок
$out .= '<picture>https://example.com/img/1.jpg</picture>' . "\r\n";
$out .= '<picture>https://example.com/img/2.jpg</picture>' . "\r\n";
// Название товара
$out .= '<name>'.$row['name'].'</name>' . "\r\n";
// Описание товара, максимум 3000 символов
$out .= '<description><![CDATA[' . stripslashes($row['text']) . ']]></description>' . "\r\n";
$out .= '</offer>' . "\r\n";
}
$out .= '</offers>' . "\r\n";
$out .= '</shop>' . "\r\n";
$out .= '</yml_catalog>' . "\r\n";
header('Content-Type: text/xml; charset=utf-8');
echo $out;
exit;
Пример сгенерированного файла:
<?xml version="1.0" encoding="UTF-8"?>
<yml_catalog date="2022-04-01T14:37:38+03:00">
<shop>
<name>Название магазина</name>
<company>ООО «Пупкин»</company>
<url>https://example.com/</url>
<currencies>
<currency id="RUR" rate="1"/>
</currencies>
<categories>
<category id="1" parentId="0">Бытовая техника</category>
<category id="2" parentId="1">Мелкая техника для кухни</category>
</categories>
<offers>
<offer id="1">
<url>https://example.com/prod/1.html</url>
<price>8990</price>
<oldprice>10000</oldprice>
<currencyId>RUR</currencyId>
<categoryId>10</categoryId>
<picture>https://example.com/img/1.jpg</picture>
<picture>https://example.com/img/2.jpg</picture>
<name>Мороженица Brand 3811</name>
<description><![CDATA[Компактный прибор с вместительной чашей (1 кг) поможет приготовить вкусные лакомства для всей семьи.]]></description>
</offer>
</offers>
</shop>
</yml_catalog>
YML-файл в ZIP архиве
Если в магазине очень много товаров, то лучше сделать формирование XML-файла по крону и запаковать его в ZIP-архив (далее использовать его в качестве источника в Яндекс.Маркете).
// Вывод в браузер не нужен
//header('Content-Type: text/xml; charset=utf-8');
//echo $out;
//exit;
$fd = fopen(__DIR__ . '/market.xml', 'w') or die('Не удалось создать файл');
fwrite($fd, $out);
fclose($fd);
$zip = new ZipArchive();
$zip->open(__DIR__ . '/market.zip', ZipArchive::CREATE|ZipArchive::OVERWRITE);
$zip->addFile(__DIR__ . '/market.xml', 'market.xml');
$zip->close();
exit;
$db_host = 'localhost';
$db_user = 'username';
$db_pass = 'passname';
$db_database = 'database_name';
$dsn = "mysql:host=$db_host;dbname=$db_database;";
$options = array(
PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"
);
$dbh = new PDO($dsn, $db_user, $db_pass, $options);
из этой таблицы `wp_wc_product_meta_lookup` я беру product_id
$out .= '<offer internal-id="' . $row['product_id'] . '">' . "\r\n";
а далее нужно брать данные из таблицы `wp_posts`
$out .= '<creation-date>' . $row['post_date'] . '</creation-date>' . "\r\n";
но в ней не 'product_id, а ID
а потом еще данные из `wp_wc_product_attributes_lookup`
по term_id
Вообще не пойму как это всё соединить.