Вход • Регистрация

Мокро разметка товара JSON LD в HEAD

  • 11 ноября 2018 г.
  • Заказчик настойчиво попросил сделать микро разметку товаров JSON LD для товаров
    Как реализовать сбор из разных модулей для вывода в HEAD
    - Поделитесь опытом пожалуйста...
    • 11 ноября 2018 г.
    • Вот так для аналогичной задачи доставал из модуля новостей разную инфу в head. Так можно с любым модулем сделать теоретически

      Код
      $news_cache = (array)$this->diafan->module->cache['model_news'];


      Вот такой конструкцией можно например прикрепленную картинку достать вне зависимости от модуля
      Код

      foreach ($this->diafan->module->cache as $cache) {

      if (isset($cache->result['img'])) {
      $images = $cache->result['img'];
      } else {
      continue;
      }
      }

      Удачи :)


      • 11 ноября 2018 г.
      • Спасибо, пока слабо вкуриваю...
        - попробую методом тыка
        • 11 ноября 2018 г.
        • Что хочешь вывести и из какого модуля?
          • 11 ноября 2018 г. , редакция: 11 ноября 2018 г.
          • На карточке товара нужно передать:

            Название
            Производитель
            Лого производителя
            фото товара
            рейтинг
            Описание
            Цену
            Код
            <!-- Разметка JSON-LD, созданная Мастером разметки структурированных данных Google. -->
            <script type="application/ld+json">
            {
            "@context" : "http://schema.org",
            "@type" : "Product",
            "name" : "Торцевой элемент Европласт 4.32.232",
            "image" : "http://site.ru/userfls/shop/large/3921_tortsevoy-element-evroplast.png",
            "description" : "Ширина: 192 мм Высота: 172 мм Глубина: 192 мм Материал: Пенополиуретан",
            "brand" : {
            "@type" : "Brand",
            "name" : "Европласт",
            "logo" : "http://site.ru/userfls/shop/small/45_evroplast.png"
            },
            "offers" : {
            "@type" : "Offer",
            "price" : "1 364"
            },
            "aggregateRating" : {
            "@type" : "AggregateRating",
            "ratingValue" : "5",
            "ratingCount" : "1"
            }
            }
            </script>
    • 12 ноября 2018 г.
    • чет такое (гуглю понравилось, но толку ноль)
      Код
      <?php
      /**
      * Шаблон страницы товара
      *
      * @package DIAFAN.CMS
      * @author diafan.ru
      * @version 6.0
      * @license http://www.diafan.ru/license.html
      * @copyright Copyright (c) 2003-2016 OOO «Диафан» (http://www.diafan.ru/)
      */

      if (! defined('DIAFAN'))
      {
      $path = __FILE__; $i = 0;
      while(! file_exists($path.'/includes/404.php'))
      {
      if($i == 10) exit; $i++;
      $path = dirname($path);
      }
      include $path.'/includes/404.php';
      }

      if (stripos(BASE_PATH.$result['img'][0]["vs"]['medium'], BASE_PATH.'/') !== false)
      {
      $img_correction = str_ireplace(BASE_PATH.'/', BASE_PATH, BASE_PATH.$result['img'][0]["vs"]['medium']);
      }
      else
      {
      $img_correction = (BASE_PATH.$result['img'][0]["vs"]['medium'] ? BASE_PATH.$result['img'][0]["vs"]['medium'] : '');
      }

      echo '<div class="good-photo">
      ';
      if (!empty($result["img"]))
      {
      if (stripos(BASE_PATH.$result["img"][0]["src"], BASE_PATH.'/') !== false)
      {
      $img_correction = str_ireplace(BASE_PATH.'/', BASE_PATH, BASE_PATH.$result["img"][0]["src"]);
      }
      else
      {
      $img_correction = (BASE_PATH.$result["img"][0]["src"] ? BASE_PATH.$result["img"][0]["src"] : '');
      }
      echo ' <div class="picture">
      <amp-img src="'.$img_correction.'" width="'.$result["img"][0]["width"].'" height="'.$result["img"][0]["height"].'" alt = "'.$result["img"][0]["alt"].'" layout="responsive"></amp-img>
      </div>
      ';
      }
      echo ' </div>
      <div class="good-description">
      '.$this->get('buy_form', 'shop', array("row" => $result, "result" => $result)).'
      <div class="call-now">
      <a href="tel:+79219667737">
      <amp-fit-text height="40" layout="fixed-height">
      Позвонить и записаться
      </amp-fit-text>
      </a>
      </div>
      ';
      if (!empty($result['text']))
      {
      echo ' <div class="shop-text">
      '.$this->htmleditor($result['text']).'
      </div>
      ';
      }
      echo '<div class="addcost-text">
      ';
      $id_addcost = DB::query("SELECT additional_cost_id FROM {shop_additional_cost_rel} WHERE element_id=%d", $result["id"]);
      if (!empty($id_addcost))
      {
      $addtext='';
      $json_addtext = '';
      while ($row = DB::fetch_array($id_addcost))
      {
      $text_addcost = DB::query_fetch_array("SELECT name1, text1, price, percent FROM {shop_additional_cost} WHERE id=%d AND trash = '0' AND act1 = '1'", $row["additional_cost_id"]);
      $addtext .= ' <p>'.$text_addcost["text1"].'</p>
      ';
      if((int)$text_addcost["price"]>0)
      {
      $json_addtext .= '"addOn": {
      "@type": "Offer",
      "name": "'.$text_addcost["name1"].'",
      "businessFunction": "Provide service",
      "priceCurrency": "RUB",
      "price": "'.$text_addcost["price"].'"
      }
      ';
      }
      elseif((int)$text_addcost["percent"]>0)
      {
      $percent[] = $text_addcost["percent"];
      }
      }
      DB::free_result($id_addcost);
      }
      $ratio = 1;
      foreach ($percent as $r)
      {
      $ratio = $ratio + ((int)$r/100);
      }
      echo $addtext;
      echo ' </div>
      <div class="good-disclaimer">
      <p><strong>Просим обратить внимание!</strong></p><p>Вашему питомцу может быть отказано в услугах в нашем салоне в следующих случаях:</p><ul class="disclaimer_ul"><li>ослабленного и физически нездорового состояния</li><li>беременности</li><li>агрессивного и неадекватного поведения</li></ul><p>Если у вашей собаки имеются хронические заболевания, патологические изменения покровов (новообразования на коже), аллергические реакции и другие особенности состояния здоровья, обязательно сообщите об этом мастеру.</p><p>Мастер оставляет за собой право взять наценку за агрессивное поведение вашего питомца (укусы, царапины, травмы).</p>
      </div>
      </div>
      ';

      $json='<script type="application/ld+json">
      {
      "@context": "http://schema.org/",
      "@type": "Product",
      "name": "'.$result["name"].'",
      ';
      $json .= (!empty($result["img"]))?'"image": [
      "'.$img_correction.'"
      ],':'';

      $descr = strip_tags((isset($result['text']))?$result['text'].'
      ':'').' '.strip_tags((!empty($id_addcost))?$addtext.'
      ':'');
      $json .= '
      "description": "'.$descr.strip_tags(' <p><strong>Просим обратить внимание!</strong></p><p>Вашему питомцу может быть отказано в услугах в нашем салоне в следующих случаях:</p><ul class="disclaimer_ul">
      ослабленного и физически нездорового состояния
      беременности
      агрессивного и неадекватного поведения
      <p>Если у вашей собаки имеются хронические заболевания, патологические изменения покровов (новообразования на коже), аллергические реакции и другие особенности состояния здоровья, обязательно сообщите об этом мастеру.</p><p>Мастер оставляет за собой право взять наценку за агрессивное поведение вашего питомца (укусы, царапины, травмы).</p>').'",';
      $offer_add = ' "priceCurrency": "RUB",
      "businessFunction": "Provide service",
      "seller": {
      "@type": "Organization",
      "@id": "https://sunnydogspb.ru/",
      "url": "https://sunnydogspb.ru/",
      "sameAs": "https://vk.com/sunnydogspb",
      "telephone": "+7-812-966-77-37",
      "name": "Зоосалон Солнечный пёс"
      }
      ';
      $offer_add .=$json_addtext.'
      ';

      if(count($result["price_arr"])>1)
      {
      foreach ($result["price_arr"] as $price)
      {
      $price_arr[] = $price["price_no_format"];
      }
      sort($price_arr);
      $json.='
      "offers": {
      "@type": "AggregateOffer",
      "lowPrice": "'.array_shift($price_arr).'",
      "highPrice": "'.(int)array_pop($price_arr)*$ratio.'",
      '.$offer_add.'
      }';
      }
      else
      {
      if ($ratio>1)
      {
      $json.='
      "offers": {
      "@type": "AggregateOffer",
      "lowPrice": "'.$result["price_arr"][0]["price_no_format"].'",
      "highPrice": "'.$result["price_arr"][0]["price_no_format"]*$ratio.'",
      '.$offer_add.'
      }';
      }
      else
      {
      $json.='
      "offers": {
      "@type": "Offer",
      "price": "'.$result["price_arr"][0]["price_no_format"].'",
      '.$offer_add.'
      }';
      }
      }



      $json.='
      }
      </script>
      ';

      echo $json;
      • 13 ноября 2018 г.
      • В шаблоне запрос к БД? Серьезно?
        • 13 ноября 2018 г.
        • Ну... плюс в том что обновление - без гемора будет)))
          • 13 ноября 2018 г.
          • А какие проблемы с костылем? Он задачу свою выполняет. Протез ноги сделать дольше, дороже и сложнее ;)
            • 13 ноября 2018 г.
            • Ну об этом и речь - разработка дороже, чем "Сделайте за 300-500 руб.'
              • 13 ноября 2018 г.
              • А я что? Я был одним из первых, кто выступал за РНРкод в шаблонах вместе с запросами к БД. В версии 4 у нас нельзя было исполнить ничего ни в шаблонах ни во вьюхах, как Вы помните. Именно по причине "воткнул костыль за минуту и пашет" сделали. Марина, конечно, делала рукалицо первое время)))
        • 13 ноября 2018 г.
        • Согласен, дичь, там это все надо в модели спрашивать-кешировать-че-там-еще. Но. Там сайт с посещаемостью аж до 25 чел/сутки с каталогом аж на 200+/- позиций. Даже с учетом того, что там все через жопу, на производительности это не сказывается никак, так что в данном случае мне по итогу пофиг. Так что - да, не стоит идти прямо вот таким путем; но, тут попросили поделиться опытом - вот вам жертва опытов))
          • 13 ноября 2018 г.
          • Это отличная помощь...!
            легко можно переделать в функцию и вызвать во вьюху

            еще раз спасибо
            nik.nichegoneskazhu (nik.nichegoneskazhu)!
  • 11 ноября 2018 г.
  • JS исполняется в браузере из HTML.
    A РНР исполняется на сервере, генерируя HTML.
    И именно в РНР есть всё о товаре в переменных.

    Просто идёте во вьюху товара и там пишете
    Код

    echo '<script type="application/ld+json">{ "@context" : "http://schema.org", "@type" : "Product", "name" : "'.$row["name"].'",....и т.д.';
    • 11 ноября 2018 г. , редакция: 11 ноября 2018 г.
    • Рейтинг и цену выковыривать и кидать в GLOBAL и подставлять во вьюху...?

      Другой вопрос в том что требуется размещение скрипта в <HEAD></HEAD>
      - Как правильно по Диафановски пихнуть полученные данные в HEAD из вьюхи?
      • 11 ноября 2018 г.
      • Не думаю что поисковик будет рендерить JS как-то. Ему просто JSON обьект парсить удобнее. Посмотри выше как из кеша доставать.
      • 13 ноября 2018 г.
      • Код
        Другой вопрос в том что требуется размещение скрипта в <HEAD></HEAD>
        Очень давно js не требуется пихать в head. Исполнится корректно из любого места страницы.
        • 13 ноября 2018 г. , редакция: 13 ноября 2018 г.
        • Это такую инструкцию прислали....
          - можно пихнуть и после Body?
          • 13 ноября 2018 г.
          • Конечно!
            Они за head все ратуют, чтобы их код исполнился первым и сразу, отправив им нужную инфу. Чаще всего счетчики так выступают, мол, чем выше, тем лучше посчитает, т.к. если в подвале, то может не догрузиться и пропустить посещение и поведение. А браузеры и поисковики рекомендуют JS совать чем ниже, тем лучше, т.к. JS блокирует отрисовку html, и для пользователей тормоза при отображении сайта.
        • 13 ноября 2018 г.
        • Цитата
          Очень давно js не требуется пихать в head.
          Иногда требуется. Когда на чистом JS одна часть в шапке, а другая часть в произвольной части страницы. И когда переносишь кусок из шапки в подвал, то вторая чать при исполнении не находит первую.

          Метрик всяких это конечно не касается. Но лучше конечно скрипт метрики разместить повыше. Тот же Яндекс даёт вариант ассинхронного скрипта, который страницу и другие скрипты никак не тормозит.
  • 12 ноября 2018 г. , редакция: 13 ноября 2018 г.
  • для товара делал примерно так:
    shop.view.id.php в самом начале файла после проверки if (! defined('DIAFAN'))...
    Код

    $img = !empty($result["img"]) ? $result["img"][0]["vs"]["medium"] : '';
    $price = !empty($result['price']) ? preg_replace('~[^0-9]~', '', $result['price']) : '';
    $text = !empty($result['text']) ? preg_replace('~(\")~', '\"', strip_tags($result['text'])) : '';
    $price = $price ? $price : ' no_price';
    $schema = <<<SCR
    <script type="application/ld+json">
    {
    "@context": "http://schema.org",
    "@type": "Product",
    SCR;
    if ($text) $schema .= '"description": "' . $text . '",';
    $schema .= '"name": "' . strip_tags($result['name']) . '",';
    if ($img) $schema .= '"image": "' . $img . '",';
    $schema .= '"offers": {
    "@type": "Offer",
    "availability": "http://schema.org/InStock",';
    $schema .= '"price": "' . $price . '",';
    $schema .= '"priceCurrency": "RUR"}
    }</script>';
    echo $schema;


    не обязательно пихать это в head, можно в любое место на странице.

Новости

  • 18 июня
  • В сборке большое обновление demo-шаблона, дополнительная защита от спама, улучшение YML-импорта и еще много важного и интересного.
  • 24 апреля
  • В новой сборке совершили революцию в структурировании кастомизированной информации в шаблонах, добавили авторегистрацию пользователей, усовершенствовали защиту от спама, актуализировали накопительную скидку, а также улучшили производительность и стабильность работы системы.
  • 12 января
  • После выхода сборки 7.1 мы выпустили уже три патча, в каждом из которых улучшаем административную часть сайта. Сборка DIAFAN.CMS 7.1.3 уже доступна к установке. 

Форум