Разное содержимое sitemap.xml для каждого из зеркал при мультиязычности сайта

899
В прошлом посте, который был посвящён организации мультиязычности сайта на Instant 1* посредством поддоменов смотрящих в один и тот же каталог на хостинге, я упоминал о том, что одна из проблем при таком подходе - как отдать разное содержимое sitemaps.xml в зависимости от того, через какой поддомен его читает робот.

Проблема не то что бы экстра сложная, скорее мне она казалась интересной (её решение).

Можно было бы конечно тупо назначить для каждого поддомена разный файл с картой сайта и в панели вебмастера указать это. Для ru.mysite.com - sitemap_ru.xml для en.mysite.com - sitemap_en.xml.

Но мне хотелось именно сохранить стандартный адрес сайтмапа sitemap.xml, при этом что бы его содержимое менялось в зависимости от хоста.

Итак, я сгенерировал три файла карты сайта.


Для основного домена - sitemap_main_domain.xml, для ru.mysite.con - sitemap_ru.xml, для en.mysite.com - sitemap_en.xml.

Положил их в корень сайта.

Туда же положил файл sitemaps.php с таким содержимым

Код PHP:
  1. <?php
  2. header('Content-Type: text/xml');
  3. $c_domain = $_SERVER['HTTP_HOST'];
  4. switch ($c_domain) {
  5. case 'mysite.com':
  6. $sm_file = 'sitemap_main_domain.xml';
  7. break;
  8. case 'en.mysite.com'':
  9. $sm_file = 'sitemap_en.xml';
  10. break;
  11. case 'ru.mysite.com'':
  12. $sm_file = 'sitemap_ru.xml';
  13. break;
  14. }
  15. echo file_get_contents($sm_file);
  16. ?>
В зависимости от того с какого хоста запрашивается sitemaps.php он берёт содержимое одного из xml файлов и вываливает его.

Теперь открываю файл url_rewrite.php и вижу там в комментариях инструкции

Код PHP:
  1. // Если вы хотите добавить собственное правило, то создайте
  2.  
  3. // файл custom_rewrite.php и объявите в нем функцию
  4.  
  5. // custom_rewrite_rules() по аналогии с текущим файлом!
Создаю файл custom_rewrite.php с таким содержимым

Код PHP:
  1. <?php
  2. function custom_rewrite_rules(){
  3. $rules[] = array(
  4. 'source' => '/^sitemap.xml$/ui',
  5. 'target' => 'sitemaps.php',
  6. 'action' => 'alias'
  7. );
  8. return $rules;
  9. }
  10. ?>
и кладу его в корень сайта.

Теперь при запросе файла sitemap.xml выводится содержимое sitemaps.php внутри которого содержимое одного из трех .xml (в зависимости от того с какого хоста спрашивают).

В валидаторе Яндекс проверял всё нормально - ошибок нет.

По поводу генератора sitemaps - в этот раз использовал вот этот набор https://github.com/pawelantczak/php-sitemap-generator - простой удобный скрипт, только пока не смог прикрутить туда добавление альтернативных lang вариантов для каждой ссылки, там вопрос немного другого харакетара - как нибудь с следующий раз). Просто указал альтернативные ссылки на языковые версии страниц через метатег добавленный в template.php


Что бы приспособить этот генератор к инстанту в начало файла SitemapGenerator.php добавил

Код PHP:
  1.  
  2. define('PATH', dirname(__FILE__));
  3. define("VALID_CMS", 1);
  4. include(PATH.'/core/cms.php');
  5. cmsCore::getInstance();
  6. $inDB = cmsDatabase::getInstance();


в simple-example.php где нибудь после

Код PHP:
  1. $sitemap = new SitemapGenerator("http://mysite.com/");
вставляем запрос данных из таблицы и генерацию ссылок из полученных данных, например объявления

Код PHP:
  1.  
  2. $inDB = cmsDatabase::getInstance();
  3.  
  4. $sql = "SELECT *
  5. FROM cms_board_items
  6. WHERE published = 1
  7. ORDER BY id ASC";
  8.  
  9. $result = $inDB->query($sql);
  10.  
  11. while ($item = $inDB->fetch_assoc($result)){
  12. $item['pubdate'] = strtotime(date("Y-m-d"));
  13. //для каждого найденного опубликованного объявления в карту сайта будет добавлена ссылка.
  14. $sitemap->addUrl("https://mysite.com/board/read".$item['cityid']."html", date('c'), 'daily', '0.5');
  15. }
http://mysite.com/ - меняем на свой хост
блок можно скопировать и повторить для следующей таблицы.
оба файла в корень сайта и открыть в браузере simple-example.php после чего можно проверить наличие в корне файла sitemap.xml и если иметь ввиду то, что в начале поста, переименовать его в sitemap_ru.xml и сгенерировать новый файл для другого хоста.

P.S. - А и да, в прошлом посте я ради красивого слога в завершении написал "продолжение следует", особо не планируя. Но Олег Васильевич ткзть поймал на слове и вот... В этот раз просто - до свидания))
Подход к организации мультиязычности на сайте с выносом на поддомен но без дублирования файлов
Комментарии (2)
Олег Васильевич я 7 августа 2020 в 17:54 +1
Имхо, идея с зеркалами для субдоменов весьма изящна.
Спасибо!
noszone 17 августа 2020 в 15:43 0
Не подскажете пожалуйста, как вручную добавить пункты в root sitemap.xml (или frontpage) несколько своих пунктов? Вот тут тема моя на форуме - https://instantcms.ru/forum/thread33637-1.html#331706