Drupal → Добавить на страницу товара микроразметку в формате JSON-LD

05.12.2016

Drupal 8

// MODULENAME.module

/**
 * Preprocess function for commerce-product.html.twig.
 */
function MODULENAME_preprocess_commerce_product(array &$vars): void {
  if ($vars['elements']['#view_mode'] == 'full') {
    $product = $vars['product_entity']; /** @var ProductInterface $product */
    $variation = $product->getDefaultVariation();
    $product_category = $product->get('field_category')->entity; /** @var TermInterface $product_category */
    $product_image = $product->get('field_image')->entity; /** @var FileInterface $product_image */

    $jsonld = [
      '@context' => 'https://schema.org/',
      '@type' => 'Product',
      'sku' => $variation->getSku(),
      'name' => $product->label(),
      'category' => $product_category ? $product_category->label() : '',
      'description' => $product->get('body')->value,
      'image' => $product_image ? $product_image->createFileUrl(FALSE) : '',
      'offers' => [
        '@type' => 'Offer',
        'price' => round($variation->getPrice()->getNumber()),
        'priceCurrency' => $variation->getPrice()->getCurrencyCode(),
        'availability' => 'http://schema.org/InStock',
        'url' => $product->toUrl('canonical', ['absolute' => TRUE])->toString(),
      ],
    ];

    $vars['title_prefix']['jsonld'] = [
      '#type' => 'html_tag',
      '#tag' => 'script',
      '#attributes' => [
        'type' => 'application/ld+json',
      ],
      '#value' => json_encode($jsonld, JSON_UNESCAPED_UNICODE),
    ];
  }
}

При этом в commerce-product.html.twig должно присутствовать:

{{ title_prefix }}
{{ title_suffix }}

Drupal 7

// MODULENAME.module

/**
 * Implements hook_node_view().
 */
function MODULENAME_node_view($node, $view_mode, $langcode) {
  if ($node->type == 'product_display' && $view_mode == 'full') {
    $product_wrap = entity_metadata_wrapper('node', $node)->field_product;
    $product_price = $product_wrap->commerce_price->value();

    $jsonld = array(
      '@context' => 'https://schema.org/',
      '@type' => 'Product',
      'name' => $product_wrap->title->value(),
      'sku' => $product_wrap->sku->value(),
      'image' => $product_wrap->field_image->file->url->value(),
      'offers' => array(
        '@type' => 'Offer',
        'price' => commerce_currency_amount_to_decimal($product_price['amount'], $product_price['currency_code']),
        'priceCurrency' => $product_price['currency_code'],
      ),
    );

    drupal_add_html_head(array(
      '#tag' => 'script',
      '#attributes' => array('type' => 'application/ld+json'),
      '#value' => drupal_json_encode($jsonld),
    ), 'script_jsonld_product');
  }
}

Описание схемы Product на schema.org
Описание схемы Product на devlopers.google.com

Написанное актуально для
Drupal 7, Drupal 8+
Похожие записи

Комментарии

Попиарю свой кастомчик, может кому пригодится. Все тоже самое что в статье, только вынесено в хуки. Когда нужно много такой разметки сделать для разных страниц, типов материалов позволит все организованно держать в 1 месте.

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

лучше использовать hook_process_html, ну а ещё лучше переместить всё в подвал перед </body>

Окей, спасибо, учту. Запишу себе переделать. Вот только я не понял на счет переноса в футер. Лучше всего, получается, в $page_bottom запихать?

При работе с entity_metadata_wrapper рекомендуется оборачивать код в try...catch

Добавить комментарий