Экспорт новостей с сайта в "Яндекс Новости"

Главные вкладки

Аватар пользователя ivnish ivnish 26 июля 2022 в 9:07
4

Если вы являетесь СМИ (или ваш клиент является СМИ), то наверняка будет задача экспорта новостей с сайта в "Яндекс Новости". Задача только на первый взгляд кажется сложной.

Итак, что такое "экспорт в Яндекс Новости". Нужно создать RSS ленту определенного формата. 80% нужных нам xml элементов нам может предоставить модуль views_rss. Но для Яндекса этого мало. По документации нужно еще добавить

в заголовок RSS. С этим нам поможет модуль созданный Андреем Березовским (duozersk) - views_rss_yandex и с недавнего времени поддерживаемый мной.

Так же модуль предоставляет элементы:

  • yandex:full-text
  • yandex:genre
  • yandex:enclosure (но он пока не работает должным образом)

Естественно я сразу подготовил версию для Drupal 9+

Однако, включить модули недостаточно. Нужно еще создать представление (views) типа "поток"

На что нужно обратить внимание:

  • Яндекс принимает новости только за последние 7 дней, поэтому делаем соответствующий критерий фильтрации
  • Заголовок не должен иметь в себе ссылку (снимаем галочку "ссылается на содержимое")
  • Добавляем поле "ссылка на содержимое" и переключаем её в режим "только URL". Эту ссылку нужно использовать для элемента link
  • Для элемента pubDate нужно добавить поле "создан в" и переключить формат даты на RFC 822 (предоставляется модулем views_rss_yandex)

Техподдержка Яндекса проверяет каждую новость и обязательно скажет вам, что "вот это вот новостью не является". Я рекомендую добавить к типу материала поле-галочку "Не выгружать в Яндекс Новости" и ставить её нодам отбракованным техподдержкой Яндекса. Таким образом они смогут остаться на вашем сайте, но будут исключены из ленты RSS для Яндекса.

Планы на будущее:

  • Нужно разобраться с работой yandex:enclosure, чтобы появилась возможность выгружать изображения и видео в новости

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

Комментарии

Аватар пользователя VasyOK VasyOK 27 июля 2022 в 2:13

У меня в голове крутится идея вывести RSS поток черeз views. Не использовать отображения типа Поток данных, а вывести поля, обрамить их нужными тегами, + изменить html.html.twig и page.html.twig для данной вьюхи.
Так ведь можно и изображения и видео и все что хочешь вывести.

Аватар пользователя VasyOK VasyOK 27 июля 2022 в 18:26

Да, но т. обр. фид формируется слишком стандартизировано. Я же предлагаю выводить то, что нужно, а не то что в модуле.

Аватар пользователя alexej.schmidt alexej.schmidt 18 апреля 2023 в 16:40

У меня получается ошибка в яндекс валидаторе:

Не найдено описание для элемента "rss". Возможно неверно указан корневой элемент.
Строка: 2Позиция: 604
Подробнее
cvc-elt.1.a: Cannot find the declaration of element 'rss'.

Не понимаю в чем проблема, помогите пожалуйста.

Аватар пользователя chelwolf chelwolf 25 мая 2023 в 14:09

Если в содержимом используется модуль параграфа, а не просто текст, вьюс выведет все его элементы с разметкой через запятую. Как быть в этом случае? Делать специальное поле под текст новости для Яндекса?

Аватар пользователя chelwolf chelwolf 26 мая 2023 в 16:03

Получаю ошибку валидации: в элементе item отсутствует атрибут turbo со значением true. Если в отладке добавить к item свойство turbo="true" - начинает работать в режиме отладки

Аватар пользователя chelwolf chelwolf 26 мая 2023 в 17:20

Решил так: перенёс в папку с темой шаблон views-view-row-rss.html.twig из модуля View RSS. Т.к. на моём сайте нет других RSS и они не планируются, я изменил этот шаблон, добавив нужное свойство к Item, мой код:

<?php
<item turbo="true">
  <
title>{{ title }}</title>
  <
link>{{ link }}</link>
  <
description>{{ description }}</description>
  {% for 
item in item_elements -%}
    <{{ 
item.key }}{{ item.attributes -}}
    {% if 
item.value -%}
      {% if 
item.cdata -%}
        ><![
CDATA[{{ item.value|raw }}]]></{{ item.key }}>
      {% else -%}
        {% if 
item.escaped -%}
          >{{ 
item.value|raw }}</{{ item.key }}>
        {% else -%}
          {% if 
item.value is iterable %}
            >{{ 
item.value|render }}</{{ item.key }}>
          {% else -%}
            >{{ 
item.value }}</{{ item.key }}>
          {% endif %}
        {% endif %}
      {% endif %}
    {% else -%}
      {{ 
' />' }}
    {% endif %}
  {%- endfor %}
</
item>
?>

Чтобы этот шаблон заработал, в theme файле нужно добавить:

<?php
function THEME_NAME_theme_registry_alter(array &$registry) {
  
$theme_dir = \Drupal::service('extension.list.theme')->getPath('THEME_NAME');
  
$registry['views_view_row_rss']['path'] = $theme_dir '/templates';
}
?>

Обратите внимание на "$theme_dir/templates" - у вас может быть другой путь, это нужно учитывать, например у меня путь выглядит так: "$theme_dir/templates/views"

Аватар пользователя VasyOK VasyOK 7 июля 2023 в 2:24

Установил модуль.
Формат/показать RSS Feed - Fields - отсутствует.
Зато есть

Формат: RSS-лента
Показать: Поля

В этих полях я не вижу ничего такого как тут на картинке
https://www.drupal.org/files/project-images/views_rss_yandex_item.png

Удалил вьюху и модуль. Решил установить его вновь. Версия 2.0.0.
Не получилось. Пишет:
Невозможно установить Views RSS: Yandex Elements, core.date_format.rfc_822 уже существует в активной конфигурации.