profftest Posted October 5, 2022 Report Share Posted October 5, 2022 Здравствуйте. Нужна ваша помощь, никак не могу сообразить. Simpla 2.3.8 лицензия. Для "Яндекс вебмастер" нужно сделать 2 файла с выгрузкой товаров в .xml через yandex.php. 1. Со всеми товарами размещёнными на сайте (их порядка 3 000) для раздела "товары и предложения". 2. С избранными товарами, которые в наличии в магазине для раздела "Яндекс турбо-страницы для магазина". Проблему со вторым пунктом я решил, поставил модуль с выгрузкой в я.маркет, все работает, выгружаются только нужные мне товары (сайт/yandex.php). А вот со вторым пунктом я ничего не могу сделать, не знаю, как создать второй фид, чтобы в нём были ВСЕ товары сайта. Да, я скопировал файл yandex.php и переименовал его, он доступен по другому адресу (сайт/convead.php)., добавил в .htaccess. # XML RewriteRule ^yandex.xml?$ yandex.php [L,QSA] RewriteRule ^convead.xml?$ convead.php [L,QSA] Логично, он выдает только товары, которые отмечены в админке для выгрузки. Как сделать, чтобы в этом .xml файле были все товары размещённые на сайте? Подскажите, пожалуйста. Я плохо во всём этом соображаю, но всегда всё делаю сам, гуглю, читаю, спрашиваю)))) Quote Link to post Share on other sites
Kosjak76 Posted October 5, 2022 Report Share Posted October 5, 2022 Это зависит от того, как выделены товары для выгрузки Без кода файла - никто ничем не поможет Quote Link to post Share on other sites
profftest Posted October 5, 2022 Author Report Share Posted October 5, 2022 11 минут назад, Kosjak76 сказал: Это зависит от того, как выделены товары для выгрузки Без кода файла - никто ничем не поможет Сделал всё по данной схеме. https://drewy.ru/en/blog/simplayandex Код файла yandex.php <?php require_once('api/Simpla.php'); $simpla = new Simpla(); header("Content-type: text/xml; charset=UTF-8"); print (pack('CCC', 0xef, 0xbb, 0xbf)); // Заголовок print "<?xml version='1.0' encoding='UTF-8'?> <!DOCTYPE yml_catalog SYSTEM 'shops.dtd'> <yml_catalog date='".date('Y-m-d H:i')."'> <shop> <name>".$simpla->settings->site_name."</name> <company>".$simpla->settings->company_name."</company> <url>".$simpla->config->root_url."</url> "; // Валюты $currencies = $simpla->money->get_currencies(array('enabled'=>1)); $main_currency = reset($currencies); print "<currencies> "; foreach($currencies as $c) if($c->enabled) print "<currency id='".$c->code."' rate='".$c->rate_to/$c->rate_from*$main_currency->rate_from/$main_currency->rate_to."'/> "; print "</currencies> "; // Категории $categories = $simpla->categories->get_categories(); print "<categories> "; foreach($categories as $c) { print "<category id='$c->id'"; if($c->parent_id>0) print " parentId='$c->parent_id'"; print ">".htmlspecialchars($c->name)."</category> "; } print "</categories> "; // Товары $simpla->db->query("SET SQL_BIG_SELECTS=1"); // Товары $simpla->db->query("SELECT v.price, v.id as variant_id, p.name as product_name, v.name as variant_name, v.position as variant_position, p.id as product_id, p.url, p.annotation, pc.category_id, i.filename as image FROM __variants v LEFT JOIN __products p ON v.product_id=p.id LEFT JOIN __products_categories pc ON p.id = pc.product_id AND pc.position=(SELECT MIN(position) FROM __products_categories WHERE product_id=p.id LIMIT 1) LEFT JOIN __images i ON p.id = i.product_id AND i.position=(SELECT MIN(position) FROM __images WHERE product_id=p.id LIMIT 1) WHERE p.visible AND p.to_yandex AND (v.stock >0 OR v.stock is NULL) GROUP BY v.id ORDER BY p.id, v.position "); print "<offers> "; $currency_code = reset($currencies)->code; // В цикле мы используем не results(), a result(), то есть выбираем из базы товары по одному, // так они нам одновременно не нужны - мы всё равно сразу же отправляем товар на вывод. // Таким образом используется памяти только под один товар $prev_product_id = null; while($p = $simpla->db->result()) { $variant_url = ''; if ($prev_product_id === $p->product_id) $variant_url = '?variant='.$p->variant_id; $prev_product_id = $p->product_id; $price = round($simpla->money->convert($p->price, $main_currency->id, false),2); print " <offer id='$p->variant_id' available='true'> <url>".$simpla->config->root_url.'/products/'.$p->url.$variant_url."</url>"; print " <price>$price</price> <currencyId>".$currency_code."</currencyId> <categoryId>".$p->category_id."</categoryId> "; if($p->image) print "<picture>".$simpla->design->resize_modifier($p->image, 200, 200)."</picture> "; print "<name>".htmlspecialchars($p->product_name).($p->variant_name?' '.htmlspecialchars($p->variant_name):'')."</name> <description>".htmlspecialchars(strip_tags($p->annotation))."</description> <sales_notes>Оплата в магазине.</sales_notes> </offer> "; } print "</offers> "; print "</shop> </yml_catalog> "; Quote Link to post Share on other sites
ps-simpla Posted October 6, 2022 Report Share Posted October 6, 2022 Удалите вот это в запросе к БД AND p.to_yandex Quote Link to post Share on other sites
Kosjak76 Posted October 6, 2022 Report Share Posted October 6, 2022 Если надо вообще все товары, то WHERE p.visible AND p.to_yandex AND (v.stock >0 OR v.stock is NULL) Надо заменить на WHERE 1 Quote Link to post Share on other sites
profftest Posted October 6, 2022 Author Report Share Posted October 6, 2022 Спасибо. Но я уже задумался, а нужно ли вообще так делать?!)))) Проверка от Яндекса вчера пришла по фиду, прошёл её, товар в наличии (в магазине). А если бы сказал нет, или под заказ - заблокировали магазин. Вот и думаешь, пусть лучше фид висит с товарами, которые в наличии в магазине, а не на складе (под заказ). Quote Link to post Share on other sites
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.