<?php @ini_set('display_errors', 1); define('MODX_API_MODE', true); require dirname(dirname(dirname(dirname(__FILE__)))) . '/index.php'; $modx->getService('error','error.modError'); $modx->setLogLevel(modX::LOG_LEVEL_INFO); $modx->setLogTarget(XPDO_CLI_MODE ? 'ECHO' : 'HTML'); if ($modx->cacheManager->get('running', array('cache_key' => 'ymarket'))) { echo 'Скрипт работает, повторный запуск отменён'; exit; } $running = true; $modx->cacheManager->set('running', $running, 0, array('cache_key' => 'ymarket')); $limit = 500; $offset = $modx->cacheManager->get('offset', array('cache_key' => 'ymarket')); $filename = __DIR__ . '/yandexmarket-gen.yml'; if (!$offset) { if (file_exists($filename)) { echo 'Файл существует, больше ничего не делаем'; $running = false; $modx->cacheManager->set('running', $running, 0, array('cache_key' => 'ymarket')); exit; } echo 'Приступаю к генерации YML-файла' . PHP_EOL; $data = '<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE yml_catalog SYSTEM "shops.dtd"> <yml_catalog date="'.date("Y-m-d H:i").'" > <shop> <name>'.$modx->getOption('site_name').'</name> <company>'.$modx->getOption('site_name').'</company> <url>'.$modx->getOption('site_url').'</url> <currencies> <currency id="RUR" rate="1"/> </currencies> <categories>'. $modx->runSnippet('pdoResources', array( 'parents' => 23, 'where' => '{"class_key":"msCategory"}', 'depth' => 0, 'sortby' => '{"menuindex":"ASC"}', 'limit' => 0, 'tpl' => 'categories' )) . '</categories> <offers>'; if (!$handle = fopen($filename, 'w')) { echo "Не могу открыть файл $filename" . PHP_EOL; $running = false; $modx->cacheManager->set('running', $running, 0, array('cache_key' => 'ymarket')); exit; } if (fwrite($handle, $data) === FALSE) { echo "Не могу произвести запись в файл $filename" . PHP_EOL; $running = false; $modx->cacheManager->set('running', $running, 0, array('cache_key' => 'ymarket')); exit; } fclose($handle); unset($data); unset($handle); // echo 'Записана шапка файла' . PHP_EOL; $offset = 0; } $end_of_file = false; if ($data = $modx->runSnippet('msProducts', array( 'parents' => 0, 'limit' => $limit, 'offset' => $offset, 'tpl' => 'offer', 'includeContent' => 1, 'includeTVs' => 'img,image', 'where' => '{"Data.price:>":0}' ))) { if (is_writable($filename)) { if (!$handle = fopen($filename, 'a')) { echo "Не могу открыть файл $filename" . PHP_EOL; $running = false; $modx->cacheManager->set('running', $running, 0, array('cache_key' => 'ymarket')); exit; } if (fwrite($handle, $data) === FALSE) { echo "Не могу произвести запись в файл $filename" . PHP_EOL; $running = false; $modx->cacheManager->set('running', $running, 0, array('cache_key' => 'ymarket')); exit; } fclose($handle); } else { echo "Файл $filename недоступен для записи" . PHP_EOL; $running = false; $modx->cacheManager->set('running', $running, 0, array('cache_key' => 'ymarket')); exit; } // echo 'Записана группа товаров от '.$offset.' до ' . ($offset + $limit); $offset = $offset + $limit; $modx->cacheManager->set('offset', $offset, 0, array('cache_key' => 'ymarket')); unset($data); if ($offset > 200000) { $end_of_file = true; } } else { $end_of_file = true; } if ($end_of_file) { $data = '</offers> </shop> </yml_catalog>'; if (is_writable($filename)) { if (!$handle = fopen($filename, 'a')) { echo "Не могу открыть файл $filename" . PHP_EOL; $running = false; $modx->cacheManager->set('running', $running, 0, array('cache_key' => 'ymarket')); exit; } if (fwrite($handle, $data) === FALSE) { echo "Не могу произвести запись в файл $filename" . PHP_EOL; $running = false; $modx->cacheManager->set('running', $running, 0, array('cache_key' => 'ymarket')); exit; } fclose($handle); } else { echo "Файл $filename недоступен для записи" . PHP_EOL; $running = false; $modx->cacheManager->set('running', $running, 0, array('cache_key' => 'ymarket')); exit; } unlink(MODX_BASE_PATH . 'yandexmarket.yml'); rename($filename, MODX_BASE_PATH . 'yandexmarket.yml'); fopen($filename, 'w'); echo 'Генерация файла YML завершена'; $offset = 0; $modx->cacheManager->set('offset', $offset, 0, array('cache_key' => 'ymarket')); } $running = false; $modx->cacheManager->set('running', $running, 0, array('cache_key' => 'ymarket')); exit;
categories
<category id="[[+id]]" [[+parent:is=`23`:then=``:else=`parentId="[[+parent]]"`]]>[[+menutitle:default=`[[+pagetitle]]`:clearYML]]</category> [[pdoResources? &parents=`{$id}` &where=`{ "class_key":"msCategory" }` &depth=`0` &sortby=`{ "menuindex":"ASC" }` &limit=`0` &tpl=`categories`]]
offer
<offer id="{$id}" available="true"> <url>{'site_url' | config}{$id | url}</url> <price>{$price | replace : ' ' : ''}</price> <currencyId>RUR</currencyId> <categoryId>{$parent}</categoryId> <picture>{'site_url' | config}{$thumb}</picture> <name>{$pagetitle | clearYML}</name> <model>{($article ?: 'id' ~ $id)| clearYML}</model> <description>{(($content | striptags) ?: $description) | clearYML}</description> <vendor>{$_pls['vendor.name'] | clearYML}</vendor> <vendorCode>{($article ?: 'id' ~ $id) | clearYML}</vendorCode> <sales_notes>Предоплата 100% Товар отгружается кратно упаковкам</sales_notes> </offer>
clearYML
<?php $output = str_replace( array('…', '&', '"', '>', '<', '\''), array('...', '&', '"', '>', '<', '''), $input); return str_replace('&', '&', $output);
Когда генерация будет завершена, содержимое файла будет скопировано в корень сайта. После этого, чтобы запустить генерацию нового файла, нужно просто удалить файл yandexmarket-gen.yml
У меня настроена задача ежедневно удалять файл в 3 часа ночи. Тогда к утру файл для яндекс-маркета обновляется и каждый день он более-менее свежий.
У меня ничего не происходит.
Категория
Продукт
YML любит ругаться на запрещенные символы, поэтому их нужно вырезать или заменять на допустимые
noreplzh@sakura:~/noreplzh.beget.tech/public_html [0] $ php7.4 -d display_errors -d error_reporting=E_ALL ~/noreplzh.beget.tech/public_html/core/components/ymarket/generate.php
Deprecated: Directive 'allow_url_include' is deprecated in Unknown on line 0
Приступаю к генерации YML-файла
[2023-04-27 21:51:10] (ERROR @ /home/n/noreplzh/noreplzh.beget.tech/public_html/core/components/ymarket/generate.php: 130) PHP warning: unlink(/home/n/noreplzh/noreplzh.beget.tech/public_html/yandexmarket.yml): No such file or directory
Генерация файла YML завершенаnoreplzh@sakura:~/noreplzh.beget.tech/public_html [0] $ php7.4 -d display_errors -d error_reporting=E_ALL ~/noreplzh.beget.tech/public_html/core/components/ymarket/generate.php
Deprecated: Directive 'allow_url_include' is deprecated in Unknown on line 0