Перейти к содержанию
Официальный форум поддержки Simpla

Как сделать два разных .xml файла для Яндекс Вебмастер (товары и предложения, турбо-страницы для магазина)?


Рекомендуемые сообщения

Здравствуйте.

Нужна ваша помощь, никак не могу сообразить. 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 файле были все товары размещённые на сайте?

Подскажите, пожалуйста. Я плохо во всём этом соображаю, но всегда всё делаю сам, гуглю, читаю, спрашиваю))))

Ссылка на сообщение
Поделиться на другие сайты

Это зависит от того, как выделены товары для выгрузки

Без кода файла - никто ничем не поможет

Ссылка на сообщение
Поделиться на другие сайты
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>
";

 

Ссылка на сообщение
Поделиться на другие сайты

Если надо вообще все товары, то

WHERE p.visible AND p.to_yandex AND (v.stock >0 OR v.stock is NULL)

Надо заменить на

WHERE 1

 

Ссылка на сообщение
Поделиться на другие сайты

Спасибо.

Но я уже задумался, а нужно ли вообще так делать?!)))) Проверка от Яндекса вчера пришла по фиду, прошёл её, товар в наличии (в магазине). А если бы сказал нет, или под заказ - заблокировали магазин. Вот и думаешь, пусть лучше фид висит с товарами, которые в наличии в магазине, а не на складе (под заказ).

Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
×
×
  • Создать...