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

+4
1.9K
В прошлом посте, который был посвящён организации мультиязычности сайта на 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 с таким содержимым

  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 и вижу там в комментариях инструкции

  1. // Если вы хотите добавить собственное правило, то создайте
  2.  
  3. // файл custom_rewrite.php и объявите в нем функцию
  4.  
  5. // custom_rewrite_rules() по аналогии с текущим файлом!
Создаю файл custom_rewrite.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 — в этот раз использовал вот этот набор github.com/pawelantczak/php-sitemap-generator — простой удобный скрипт, только пока не смог прикрутить туда добавление альтернативных lang вариантов для каждой ссылки, там вопрос немного другого харакетара — как нибудь с следующий раз). Просто указал альтернативные ссылки на языковые версии страниц через метатег добавленный в template.php


Что бы приспособить этот генератор к инстанту в начало файла SitemapGenerator.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 где нибудь после

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

  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. }
mysite.com/ — меняем на свой хост
блок можно скопировать и повторить для следующей таблицы.
оба файла в корень сайта и открыть в браузере simple-example.php после чего можно проверить наличие в корне файла sitemap.xml и если иметь ввиду то, что в начале поста, переименовать его в sitemap_ru.xml и сгенерировать новый файл для другого хоста.

P.S. — А и да, в прошлом посте я ради красивого слога в завершении написал "продолжение следует", особо не планируя. Но Олег Васильевич ткзть поймал на слове и вот… В этот раз просто — до свидания))
Олег Васильевич я Олег Васильевич я 4 года назад #
Комментарий удален
0
noszone noszone 4 года назад #
Не подскажете пожалуйста, как вручную добавить пункты в root sitemap.xml (или frontpage) несколько своих пунктов? Вот тут тема моя на форуме - /forum/thread33637-1.html#331706

Еще от автора

Капча на сайт или разделы сайта
Если нужно, закрыть весь сайт или некоторые его разделы каптчей.
Пинг поисковых систем для первой ветки
Небольшая интеграция инструментов для пингования, чтобы сделать его чуть удобнее
Генератор карты сайта в формате txt на лету без крона
Вообще то где то тут уже есть вполне рабочие генераторы карты для первой ветки, но этот вариант тоже имеет право быть.
Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.