Textpattern CMS, MLP и карта сайта (sitemap)
При использовании в Textpattern CMS плагина Multi-Lingual Publishing Pack возникает проблема при генерации файла sitemap (который XML-ный список всех страниц сайта). Эта проблема заключается в том, что в URL страниц сайта не содержится идентификатор языка. Т.е. если для статьи на русском языке правильная ссылка выглядит, например, так:
http://www.mysite.com/ru/section/id/title
То в результате в файле sitemap будет такая ссылка:
http://www.mysite.com/section/id/title
что совсем неправильно.
Для генерации карты сайта я пробовал использовать плагины rah_sitemap и jmd_sitemap – результат одинаково неправильный.
Однако существует выход из этой ситуации. Распишу его по шагам:
1. Устанавливаем плагин mg_setheader. Этот плагин предназначен для установки/изменения Header
для любых страниц Textpattern. Нам он понадобится для изменения "Content-Type"
на "text/xml"
(для всех страниц Textpattern ставит "text/html"
).
2. Делаем правку 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'] = '<loc>';
$l10n_replace_strings['stop'] = $l10n_replace_strings['stop_rep'] = '</loc>';
$l10n_replace_strings['insert_blank'] = false;
$pattern3 = _l10n_make_pattern();
$buffer = _l10n_preg_replace_callback( $pattern3, '_l10n_inject_lang_markers_cb', $buffer );
Благодаря этому коду MLP будет выполнять подстановку языкового сегмента URL в адреса заключенные в теги <loc></loc>
, используемые в файлах sitemap.
3. Создаем форму с названием sitemap и типом article. Код формы будет таким:
<url><loc><txp:permlink /></loc><lastmod><txp:posted format="%Y-%m-%d" /></lastmod></url>
4. Добавляем страницу с именем sitemap. Код шаблона страницы будет следующим:
<txp:mg_setheader /><?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<txp:article_custom limit="9999" form="sitemap" sort="ID"/></urlset>
limit="9999"
– ограничение на количество статей (выведет только 9999), form="sitemap"
– используем форму sitemap для вывода, sort="ID"
– сортируем по идентификаторам статей.
5. Затем создаем секцию sitemap. Для секции назначаем страницу sitemap и везде ставим «Нет».
В результате у нас появились карты сайта для каждого из языков, используемых на сайте.
Теперь осталось в корневой директории нашего сайта создать sitemap.xml, в котором будет список sitemap для каждого из языков.
Например, для языков en, ru и uk файл sitemap.xml будет выглядеть так:
<?xml version="1.0" encoding="UTF-8"?>
<sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<sitemap>
<loc>http:// www.mysite.com/en/sitemap</loc>
</sitemap>
<sitemap>
<loc>http:// www.mysite.com/ru/sitemap</loc>
</sitemap>
<sitemap>
<loc>http:// www.mysite.com/uk/sitemap</loc>
</sitemap>
</sitemapindex>