Для типа материала "Новости" вывожу в head сайта метки для Фейсбук, чтобы пост при шаринге страницы в ленте отображался с картинкой и другими атрибутами, согласно документации: https://developers.facebook.com/docs/sharing/webmasters
Чтобы это реализовать, нужно сделать две вещи:
1) Передать значение двух полей ноды для шаблона html.html.twig через файлик mytheme.theme
2) Настроить вывод в самом html.html.twig
Вывод в файле html.html.twig:
<?php{% if node_type == 'news' %}
<meta property="og:url" content="{{ url('<current>') }}" />
<meta property="og:type" content="article" />
<meta property="og:title" content="{{ drupal_title() }}" />
{% if news_body is not empty %}
<meta property="og:description" content="{{ news_body }}" />
{% endif %}
{% if news_cover is not empty %}
<meta property="og:image" content="{{ news_cover }}" />
{% endif %}
{% endif %}?>
Проблема возникла с передачей переменных, добился для новостей корректного отображения, но на главной странице вылетает белый экран. Оно и понятно, главная страница - не узел. Вопрос - как при передаче переменных сделать проверку, чтобы эта переменная передавалась только для новостей. Голову уже сломал. Код в фале такой:
<?php
function mytheme_preprocess_html(&$variables) {
$node = \Drupal::routeMatch()->getParameter('node');
if (isset($node)){
$nodelabel = $node->type->entity->label();
if ($nodelabel == "news"){
$news_teaser = $node->get('body')->summary;
$news_cover = $node->get('field_news_cover_inside')->entity->url();
$variables['news_body'] = $news_teaser;
$variables['news_cover'] = $news_cover;
}
}
}?>
В текущей версии код не работает. Если убрать текущие проверки - получаю ошибку: Error: Call to a member function get() on null
На главной странице ошибки вызывают строчки:
$news_teaser = $node->get('body')->summary;
$news_cover = $node->get('field_news_cover_inside')->entity->url();
Комментарии
<?php if ($node instanceof \Drupal\node\NodeInterface) ?>
Спасибо проверка работает, но теперь выдаёт ошибку на другое поле ($news_cover = $node->get('field_news_cover_inside')->entity->url();) - оно есть только в типе материала "новости" (машинное имя news), как выводить переменную только для этого типа материала?
Конструкция у меня не сработала:
<?php
$nodelabel = $node->type->entity->label();
if ($nodelabel == "news"){}
?>
Разобрался, моё решение такое:
<?php
function mytheme_preprocess_html(&$variables) {
$node = \Drupal::routeMatch()->getParameter('node');
if ($node instanceof \Drupal\node\NodeInterface) {
$nodelabel = $node->bundle();
if ($nodelabel == "news"){
$news_teaser = $node->get('body')->summary;
$news_cover = $node->get('field_news_cover_inside')->entity->url();
$variables['news_body'] = $news_teaser;
$variables['news_cover'] = $news_cover;
}
}
}
?>
Поправка - добавляем ещё одну проверку на пустоту поля, прежде чем присвоить значение переменной:
<?php
function netprizyvu_preprocess_html(&$variables) {
$node = \Drupal::routeMatch()->getParameter('node');
if ($node instanceof \Drupal\node\NodeInterface) {
$nodelabel = $node->bundle();
if ($nodelabel == "news"){
if ($node->hasField('field_news_cover_inside') && !$node->get('field_news_cover_inside')->isEmpty()) {
$news_cover = $node->get('field_news_cover_inside')->entity->url();
$variables['news_cover'] = $news_cover;
}
$news_teaser = $node->get('body')->summary;
$variables['news_body'] = $news_teaser;
}
}
}
?>