CommerCentr
EN
Sign in

Микроразметка json-ld для категории opencart

#1
Здравствуйте, создаю модификатор для разметки категори товаров opencart микроразметкой json-ld, прошу помочь. Один из вариантов отрабатывает с ошибкой, так как в конце цикла добавляется лишняя запятая, как ее убрать?

<?xml version="1.0" encoding="UTF-8"?>
<modification>
<name>Category json-ld</name>
<version>1.0</version>
<link></link>
<author>nuub</author>
<code>category-json-ld</code>


<file path="catalog/view/theme/*/template/product/category.tpl">
<operation>
<search><![CDATA[<?php echo $footer; ?>]]></search>
<add position="before"><![CDATA[
<script type="application/ld+json">
{
"@context": "http://schema.org",
"@type": "ItemList",
"url": "<?php echo $breadcrumb['href']; ?>",
"numberOfItems": "<?php echo $product_total; ?>",
"itemListElement": [<?php foreach ($products as $product) { ?>
{
"@type": "Product",
"image": "<?php echo $product['thumb']; ?>",
"url": "<?php echo $product['href']; ?>",
"name": "<?php echo $product['name']; ?>",
"offers": {
"@type": "Offer",
"price": "<?php echo $product['price']; ?>"
}
},<?php } ?>
]
}
</script>
]]></add>
</operation>
</file>
</modification>
#2
Ось ці варіанти не зміг прикрутити
<?php echo rtrim('Тут код', ','); ?>
<?php echo substr('Тут код', 0, -1); ?>
#3
вот так было бы корретней:
<?xml version="1.0" encoding="UTF-8"?>
<modification>
<name>Category json-ld</name>
<version>1.0</version>
<link></link>
<author>nuub</author>
<code>category-json-ld</code>
<file path="catalog/view/theme/*/template/product/category.tpl">
<operation>
<search><![CDATA[<?php echo $footer; ?>]]></search>
<add position="before"><![CDATA[
<script type="application/ld+json">
{
"@context": "http://schema.org",
"@type": "ItemList",
"url": "<?php echo $breadcrumb['href']; ?>",
"numberOfItems": "<?php echo $product_total; ?>",
"itemListElement": [<?php foreach ($products as $key => $product) { ?>
{
"@type": "Product",
"image": "<?php echo $product['thumb']; ?>",
"url": "<?php echo $product['href']; ?>",
"name": "<?php echo $product['name']; ?>",
"offers": {
"@type": "Offer",
"price": "<?php echo $product['price']; ?>"
}
}<?php if ($key != count($products)){ ?>,<?php } ?><?php } ?>
]
}
</script>
]]></add>
</operation>
</file>
</modification>

а вот по 2-му сообщения недопонял, что не получается куда прикрутить а в чем трабл?
#4
Дякую, спрацювало, скоригував <?php if ($key != count($products) - 1){ ?>
<?xml version="1.0" encoding="UTF-8"?>
<modification>
<name>Category json-ld</name>
<version>1.0</version>
<link></link>
<author>nuub</author>
<code>category-json-ld</code>
<file path="catalog/view/theme/*/template/product/category.tpl">
<operation>
<search><![CDATA[<?php echo $footer; ?>]]></search>
<add position="before"><![CDATA[
<script type="application/ld+json">
{
"@context": "http://schema.org",
"@type": "ItemList",
"url": "<?php echo $breadcrumb['href']; ?>",
"numberOfItems": "",
"itemListElement": [<?php foreach ($products as $key => $product) { ?>
{
"@type": "Product",
"image": "<?php echo $product['thumb']; ?>",
"url": "<?php echo $product['href']; ?>",
"name": "<?php echo $product['name']; ?>",
"offers": {
"@type": "Offer",
"price": "<?php echo $product['price']; ?>"
}
}<?php if ($key != count($products) - 1){ ?>,<?php } ?><?php } ?>
]
}
#5
по логике, было бы правилней код:
count($products) - 1

взять в скобки, что бы получилось примерно так:
<?php if ($key != (count($products) - 1)){ ?>
#6
Поправил, спасибо, странно но валидатор микроразметки ругается на отсутсвие параметра
"position": №п/п,
Как его реализовать внутри цикла foreach ?
<? php $i++; ?>

<name>Category json-ld</name>
<version>1.0</version>
<link></link>
<author>nuub</author>
<code>category-json-ld</code>
<file path="catalog/view/theme/*/template/product/category.tpl">
<operation>
<search><![CDATA[<?php echo $footer; ?>]]></search>
<add position="before"><![CDATA[
<script type="application/ld+json">
{
"@context": "http://schema.org",
"@type": "ItemList",
"url": "<?php echo $breadcrumb['href']; ?>",
"numberOfItems": "$total_product", //здесь количество товаров на странице
"itemListElement": [<?php foreach ($products as $key => $product) { ?>
{
"@type": "Product",
"position": $i++, //здесь номер по порядку
"image": "<?php echo $product['thumb']; ?>",
"url": "<?php echo $product['href']; ?>",
"name": "<?php echo $product['name']; ?>",
"offers": {
"@type": "Offer",
"price": "<?php echo $product['price']; ?>"
}
}?php if ($key != (count($products) - 1)){ ?>,<?php } ?><?php } ?>
]
}
#7
"position", якщо не помиляюсь, то матюкається коли в ItemList не вказано, а тут не бачу щоб було, може в "хлібних крихтах" де пропустили?
якщо потрібно вказати порядковий номер, то перед циклом добавляємо змінну, а після - інкрементуємо значення, тобто повинно бути приблизно ось так:

{
"@context": "http://schema.org",
"@type": "ItemList",
"url": "<?php echo $breadcrumb['href']; ?>",
"numberOfItems": "<?php echo count($products); ?>",
"itemListElement": [<?php $i = 0; foreach ($products as $key => $product) { $i++; ?>
{
"@type": "Product",
"position": "<?php echo $i; ?>",
"image": "<?php echo $product['thumb']; ?>",
"url": "<?php echo $product['href']; ?>",
"name": "<?php echo $product['name']; ?>",
"offers": {
"@type": "Offer",
"price": "<?php echo $product['price']; ?>"
}
}<?php if ($key != (count($products) - 1)){ ?>,<?php } ?><?php } ?>
]
}
#8
Дякую Baco. Не вдається пройти валідатор з Product, але з ListItem нормально
<?xml version="1.0" encoding="UTF-8"?>
<modification>
<name>Category json-ld</name>
<version>1.0</version>
<link></link>
<author>nuub-ALarik-Baco</author>
<code>category-json-ld</code>
<file path="catalog/view/theme/*/template/product/category.tpl">
<operation>
<search><![CDATA[<?php echo $footer; ?>]]></search>
<add position="before"><![CDATA[
<script type="application/ld+json">
{
"@context": "http://schema.org",
"@type": "ItemList",
"url": "<?php echo $breadcrumb['href']; ?>",
"numberOfItems": "<?php echo count($products); ?>",
"itemListElement": [<?php $i = 0; foreach ($products as $key => $product) { $i++; ?>
{
"@type": "ListItem",
"position": "<?php echo $i; ?>",
"image": "<?php echo $product['thumb']; ?>",
"url": "<?php echo $product['href']; ?>",
"name": "<?php echo $product['name']; ?>"
}<?php if ($key != (count($products) - 1)){ ?>,<?php } ?><?php } ?>
]
}
</script>
]]></add>
</operation>
</file>
</modification>

Залишаю варіант каруселі без офера
1566557940129.pngВкладення: 1566557920986.png · 1566557940129.png
#9
додам одразу сюди інфо, щодо виводу в категорії також для хлібних крихт мікророзмітки:
<script type="application/ld+json">
{
"@context": "http://schema.org",
"@type": "BreadcrumbList",
"itemListElement": [
<?php foreach ($breadcrumbs as $i=> $breadcrumb) { ?>
{
"@type": "ListItem",
"position": <?php echo $i + 1; ?>,
"item": {
"@id": "<?php echo $breadcrumb['href']; ?>",
"name": "<?php echo $breadcrumb['text']; ?>"
}
}<?php if ($i != (count($breadcrumbs) - 1)){ ?>,<?php } ?>
<?php } ?>
]
}
</script>


p.s. так як на проекті ми співпрацюємо тісно з сеошниками, то по всім правилам рекомендовано в першу крихту з хлібних, що в контроллері категорії, додавати не $this->language->get('text_home'), а саме змінну з назвою магазину, наприклад: не "Головна", а "Інтернет-магазин цифрових товарів", тобто вийдуть хлібні крихти по типу:
Інтернет-магазин цифрових товарів -> Модулі -> Мікророзмітка категорій для ОС 1.5, в коді це виглядає так:
знайти блок:
$this->data['breadcrumbs'][] = array(
'text' => $this->language->get('text_home'),
'href' => $this->url->link('common/home'),
'separator' => false
);

та поміняти на свою змінну, попередньо прописану в мовному файлі:
$this->data['breadcrumbs'][] = array(
'text' => $this->language->get('text_seo_home'),
'href' => $this->url->link('common/home'),
'separator' => false
);
#10
Bacoдодам одразу сюди інфо, щодо виводу в категорії також для хлібних крихт мікророзмітки:
<script type="application/ld+json">
{
"@context": "http://schema.org",
"@type": "BreadcrumbList",
"itemListElement": [
<?php foreach ($breadcrumbs as $i=> $breadcrumb) { ?>
{
"@type": "ListItem",
"position": <?php echo $i + 1; ?>,
"item": {
"@id": "<?php echo $breadcrumb['href']; ?>",
"name": "<?php echo $breadcrumb['text']; ?>"
}
}<?php if ($i != (count($breadcrumbs) - 1)){ ?>,<?php } ?>
<?php } ?>
]
}
</script>


у мене на для хлібних крихт мікророзмітки - видае помилку

Отсутствует символ "," или "}" в декларации объекта.
Де може бути проблема, не можу знайти - шаблон Unishop
#11
ivideoу мене на для хлібних крихт мікророзмітки - видае помилку

Отсутствует символ "," или "}" в декларации объекта.
Де може бути проблема, не можу знайти - шаблон Unishop

у мене видавало зазвичай помилку, коли головну хлібну крихту виводило, бо там символ ' вважається забороненим і треба єкранувати. Напишіть в ЛС, спробуємо разом розібратись та поправити.
#12
Добрый день коллеги шопмейкеры. помогите пожалуйсто имею такую вот ошибку JSON-LD разметка не может быть разобрана. Проверьте документ на синтаксические ошибки: ...05/.jpg" width="1200"...
выдает на это "image": ["https://pggnn.com/img/52505/.jpg" width="1200" height="800" data-width="1200" data-height="800"],
я так понимаю нужно убрать запятую. куда копать ? установлен опенкарт 3
#13
доброго дня, вельмишановний!
властивість "image" не повинна мати ніяких параметрів, окрім uri на малюнок і без клямр, просто"image": "https://pggnn.com/img/52505/.jpg",

Anyone can read. To post and vote, sign in.