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
Добавить комментарий