Вопрос или проблема
У меня есть сторонний инструмент, который извлекает контент из фида нашего сайта на WordPress через наш RSS фид: http://ontariotravelblog.com/feed
Фид предоставляет мне все необходимое, кроме даты последнего обновления записи блога; он включает дату публикации, однако это просто дата, когда блог был впервые опубликован; редактирования / изменения, внесенные в блог после публикации, не влияют на эту дату.
Теперь интересно, что версия фида ATOM (http://ontariotravelblog.com/feed/atom) действительно включает как дату публикации, так и дату обновления, например:
<entry>
...
<title type="html">
<![CDATA[8 песен для вашего плейлиста дорожной поездки по Онтарио]]>
</title>
<id>http://ontariotravelblog.com/?p=5621</id>
<updated>2016-06-09T16:40:46Z</updated>
<published>2016-05-10T16:25:35Z</published>
...
</entry>
Что замечательно, за исключением того, что фид ATOM не содержит некоторых критически важных элементов (в частности, в нем отсутствует ряд элементов “media:”, таких как media:thumbnail и т.д.)
Итак, после всего этого, мой вопрос: есть ли способ получить поле updated, которое включено в запись фида ATOM, чтобы оно появилось в основном RSS фиде? (возможно, через какую-то опцию конфигурации?)
Atom против RSS2
Давайте взглянем на файлы wp-includes/feed-atom.php
и wp-includes/feed-rss2.php
.
Элемент updated
записи фида Atom это:
<updated><?php
echo mysql2date(
'Y-m-d\TH:i:s\Z',
get_lastpostmodified('GMT'),
false
);
?></updated>
Элемент pubDate
элемента фида RSS2 это:
<pubDate><?php
echo mysql2date(
'D, d M Y H:i:s +0000',
get_post_time('Y-m-d H:i:s', true),
false
);
?></pubDate>
Элемент lastBuildDate
канала RSS2 это:
<lastBuildDate><?php
echo mysql2date(
'D, d M Y H:i:s +0000',
get_lastpostmodified('GMT'),
false
);
?></lastBuildDate>
Пространство имен
Фид RSS2 уже содержит пространство имен Atom:
xmlns:atom="http://www.w3.org/2005/Atom"
Поэтому я думаю, что мы можем использовать элемент <atom:updated>
для нашего пользовательского элемента updated. Возможно, вам стоит изучить это более подробно, если это соответствует стандарту или если есть другие возможные пространства имен, подходящие для этого.
В последнем случае мы можем использовать действие rss2_ns
, чтобы добавить соответствующее пространство имен.
Внедрение пользовательского элемента
Мы можем использовать действие rss2_item
, чтобы внедрить пользовательские элементы, например:
add_action( 'rss2_item', function()
{
printf(
'<atom:updated>%s</atom:updated>',
get_post_modified_time( 'D, d M Y H:i:s +0000', true )
);
} );
Надеюсь, вы сможете адаптировать это под свои нужды.
это отличная идея для обратной ссылки
Ответ или решение
Чтобы получить дату последнего обновления статьи из RSS-ленты вашего сайта на WordPress, необходимо внести некоторые изменения в код, отвечающий за генерацию RSS. Поскольку стандартная RSS-лента не включает элемент обновленной даты, мы можем использовать хуки WordPress для добавления этого поля в ленту.
1. Понимание структуры RSS и ATOM
Как вы заметили, в формате ATOM содержится элемент <updated>
, который показывает дату последнего обновления. В то время как стандартная RSS-лента предоставляет только дату публикации через элемент <pubDate>
.
Помимо этого, ATOM использует пространство имен, которое может быть использовано и в RSS-ленте, так как ваша RSS-лента уже содержит этот атрибут:
xmlns:atom="http://www.w3.org/2005/Atom"
2. Добавление элемента <atom:updated>
в RSS-ленту
Для добавления даты последнего обновления в RSS-ленту, вам нужно будет воспользоваться хук rss2_item
. Этот хук позволяет вставлять дополнительные элементы в каждую запись ленты. Вот пример кода, который вы можете добавить в файл functions.php
вашей темы:
// Добавление элемента <atom:updated> в RSS-ленту
add_action('rss2_item', function() {
// Получаем дату последнего изменения в нужном формате
$last_modified = get_post_modified_time('D, d M Y H:i:s +0000', true);
// Выводим элемент <atom:updated>
printf('<atom:updated>%s</atom:updated>', esc_html($last_modified));
});
3. Понимание кода
- Хук
rss2_item
– это действие, которое позволяет вам добавлять содержимое в каждый элемент RSS. - Функция
get_post_modified_time()
– используется для получения даты последнего изменения поста. Первый параметр задает формат даты, второй параметр указывает, что время нужно получить в GMT. - Функция
esc_html()
– обеспечивает безопасное отображение даты в XML, защищая от потенциальных уязвимостей.
4. Проверка изменений
После внесения этих изменений в файл functions.php
, вы можете проверить вашу RSS-ленту, перейдя по адресу: http://ontariotravelblog.com/feed. В каждой записи вы должны увидеть новый элемент <atom:updated>
, который будет содержать дату последнего изменения поста.
Заключение
Включение даты последнего обновления в вашу RSS-ленту не только улучшит ее функциональность, но и даст вашим пользователям информацию о том, как актуален контент. Применив приведенные инструкции, вы сможете легко интегрировать эту функциональность и сделать свою ленту RSS более информативной.
Это решение также поможет улучшить стабильность и актуальность вашего контента в глазах читателей и поисковых систем, предоставляя полноценную информацию о вашем блоге.