Textpattern CMS, MLP и rss feed.
При использовании в Textpattern CMS плагина Multi-Lingual Publishing Pack возникает проблема при генерации rss feed. RSS генерируется движком Textpattern, при этом не учитывается наличие плагина MLP. В результате сгенерированная лента содержит URL страниц сайта в которых отсутствует идентификатор языка. Т.е. если для статьи на русском языке правильная ссылка выглядит, например, так:
http://www.mysite.com/ru/section/id/title
То в результате в rss feed будет такая ссылка:
http://www.mysite.com/section/id/title
что неправильно.
Проблему эту решить просто. Решение аналогично решению проблемы с генерацией sitemap:
1. Устанавливаем плагин mg_setheader. Этот плагин предназначен для установки/изменения Header
для любых страниц Textpattern. Нам он понадобится для изменения "Content-Type"
на "text/xml"
(для всех страниц Textpattern ставит "text/html"
).
2. Устанавливаем плагин jad_oldposted. Плагин используется для вывода даты.
3. Правим исходники MLP плагина. Открываем управление плагинами. Ищем Multi-Lingual Publishing Package и жмем «Редактировать». Ищем функцию _l10n_inject_lang_markers()
. В теле функции ищем следующий код:
# Insert language code into any URLs embedded as text in hyperlinks (eg search results)...
$l10n_replace_strings['start'] = $l10n_replace_strings['start_rep'] = '>';
$l10n_replace_strings['stop'] = $l10n_replace_strings['stop_rep'] = '</a>';
$l10n_replace_strings['insert_blank'] = false;
$pattern2 = _l10n_make_pattern();
$buffer = _l10n_preg_replace_callback( $pattern2, '_l10n_inject_lang_markers_cb', $buffer );
После дописываем следующий кусочек кода и сохраняем:
$l10n_replace_strings['start'] = $l10n_replace_strings['start_rep'] = '<link>';
$l10n_replace_strings['stop'] = $l10n_replace_strings['stop_rep'] = '</link>';
$l10n_replace_strings['insert_blank'] = false;
$pattern4 = _l10n_make_pattern();
$buffer = _l10n_preg_replace_callback( $pattern4 , '_l10n_inject_lang_markers_cb' , $buffer );
$l10n_replace_strings['start'] = $l10n_replace_strings['start_rep'] = '<guid>';
$l10n_replace_strings['stop'] = $l10n_replace_strings['stop_rep'] = '</guid>';
$l10n_replace_strings['insert_blank'] = false;
$pattern5 = _l10n_make_pattern();
$buffer = _l10n_preg_replace_callback( $pattern5 , '_l10n_inject_lang_markers_cb' , $buffer );
Благодаря этому коду MLP будет выполнять подстановку языкового сегмента URL в адреса заключенные в теги <link></link>
и <guid></guid>
, используемые в файлах rss feed.
4. Создаем форму с названием rss-item и типом article. Код формы будет таким:
<item>
<title><txp:title /></title>
<description><![CDATA[
<txp:body />
]]></description>
<link><txp:permlink /></link>
<pubDate><txp:jad_oldposted format="D, d M Y H:i:s" /> GMT</pubDate>
<dc:creator><txp:author /></dc:creator>
<guid><txp:permlink /></guid>
</item>
5. Добавляем страницу с именем rss. Код шаблона страницы будет следующим:
<txp:mg_setheader /><?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
<channel>
<generator>http://textpattern.com/</generator>
<title>##z_title##</title>
<link><txp:site_url /></link>
<description>##z_slogan##</description>
<copyright>Copyrights (c) <txp:php>echo gmdate( "Y" );</txp:php> ##z_title##. All rights reserved.</copyright>
<pubDate><txp:php>echo gmdate( "D, d M Y H:i:s T" );</txp:php></pubDate>
<txp:article_custom allowoverride="0" form="rss-item" limit="25" sort="Posted desc" />
</channel>
</rss>
limit="25"
– ограничение на количество статей (выведет только 25), form="rss-item"
– используем форму rss-item для вывода, sort="Posted desc"
– сортируем по дате публикации статей.
6. Теперь создаем секцию rss-feed. Для секции назначаем страницу rss и везде ставим «Нет».
В результате у нас появились rss feed для каждого из языков, используемых на сайте.
Например, для языков en – http://www.mysite.com/en/rss-feed, ru – http://www.mysite.com/ru/rss-feed и uk – http://www.mysite.com/uk/rss-feed.