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

nuub

nuub

Шопмейкер
#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>
 
Симпатії: Baco
OP
nuub

nuub

Шопмейкер
Thread Starter #2
Ось ці варіанти не зміг прикрутити
<?php echo rtrim('Тут код', ','); ?>
<?php echo substr('Тут код', 0, -1); ?>
 
ALarik

ALarik

expert
#3
вот так было бы корретней:
XML:
<?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-му сообщения недопонял, что не получается куда прикрутить а в чем трабл?
 
OP
nuub

nuub

Шопмейкер
Thread Starter #4
Дякую, спрацювало, скоригував <?php if ($key != count($products) - 1){ ?>
XML:
<?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 } ?>
        ]
    }
 
ALarik

ALarik

expert
#5
по логике, было бы правилней код:
PHP:
count($products) - 1
взять в скобки, что бы получилось примерно так:
PHP:
<?php if ($key != (count($products) - 1)){ ?>
 
Симпатії: nuub
OP
nuub

nuub

Шопмейкер
Thread Starter #6
Поправил, спасибо, странно но валидатор микроразметки ругается на отсутсвие параметра
"position": №п/п,
Как его реализовать внутри цикла foreach ?
<? php $i++; ?>

PHP:
<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 } ?>
        ]
    }
 
Baco

Baco

architect
#7
"position", якщо не помиляюсь, то матюкається коли в ItemList не вказано, а тут не бачу щоб було, може в "хлібних крихтах" де пропустили?
якщо потрібно вказати порядковий номер, то перед циклом добавляємо змінну, а після - інкрементуємо значення, тобто повинно бути приблизно ось так:

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": "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 } ?>
        ]
    }
 
Останнє редагування модератором:
OP
nuub

nuub

Шопмейкер
Thread Starter #8
Дякую Baco. Не вдається пройти валідатор з Product, але з ListItem нормально
XML:
<?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.83 - opencart
 

Вкладення

Останнє редагування:
Baco

Baco

architect
#9
додам одразу сюди інфо, щодо виводу в категорії також для хлібних крихт мікророзмітки:
JavaScript:
<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, в коді це виглядає так:
знайти блок:
PHP:
        $this->data['breadcrumbs'][] = array(
               'text'      => $this->language->get('text_home'),
               'href'      => $this->url->link('common/home'),
               'separator' => false
           );
та поміняти на свою змінну, попередньо прописану в мовному файлі:
PHP:
        $this->data['breadcrumbs'][] = array(
               'text'      => $this->language->get('text_seo_home'),
               'href'      => $this->url->link('common/home'),
               'separator' => false
           );
 
Останнє редагування:
I

ivideo

Шопмейкер
#10
додам одразу сюди інфо, щодо виводу в категорії також для хлібних крихт мікророзмітки:
JavaScript:
<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
 
Останнє редагування модератором:
Baco

Baco

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

Отсутствует символ "," или "}" в декларации объекта.
Де може бути проблема, не можу знайти - шаблон Unishop
у мене видавало зазвичай помилку, коли головну хлібну крихту виводило, бо там символ ' вважається забороненим і треба єкранувати. Напишіть в ЛС, спробуємо разом розібратись та поправити.
 
N

nsklital

Шопмейкер
#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
 
Останнє редагування модератором:
Baco

Baco

architect
#13
доброго дня, вельмишановний!
властивість "image" не повинна мати ніяких параметрів, окрім uri на малюнок і без клямр, просто "image": "https://pggnn.com/img/52505/.jpg",
 
Зверху