Генератор карты сайта в формате txt на лету без крона

+3
158

Всё началось с того, что гугл уже три дня не хочет жрать мою карту сайта для нового сайта и я решил попробовать добавить другой вариант карты, в этот раз в формате txt, так я пришёл к необходимости создать свой генератор, и дальше к самому методу.
Метод подходит для сайтов где используется всего один или два компонента из арсенала первой ветки.
Для его реализации нужно понимание того в каких таблицах бд хранятся записи из нужных нам компонентов, например для доски объявлений это cms_board_items
и как формируется ссылка на запись в нужном нам компоненте, для ДО шаблон ссылки /board/read(id).html для статьи /content/(seo url).html
Если понимание этих моментов есть, можно продолжить.

Создаём php файл с таким содержимым.

  1. <?php
  2.  
  3. define('PATH', dirname(__FILE__));
  4. define("VALID_CMS", 1);
  5. include(PATH.'/core/cms.php');
  6.  
  7. cmsCore::getInstance();
  8. $inDB = cmsDatabase::getInstance();
  9.  
  10. $text = '';
  11. $c_domain = $_SERVER['HTTP_HOST'];
  12.  
  13. //блок с постоянными ссылками, который добавлены в карту вручную
  14.  
  15. $text .= 'https://'.$c_domain.'/about.html'."\n";
  16. $text .= 'https://'.$c_domain.'/terms.html'."\n";
  17.  
  18. //блок с автоматически сгенерированными ссылками
  19. //для каждого компонента дублируем следующий блок "блок", меняя таблицу, и шаблон ссылки
  20.  
  21. //блок начало
  22. $sql = "SELECT * FROM cms_board_items WHERE published = 1 ORDER BY id ASC";
  23. $result = $inDB->query($sql);
  24. while ($item = $inDB->fetch_assoc($result)){
  25. $text .= 'https://'.$c_domain.'/board/read'.$item['id'].'.html'."\n";
  26. }
  27. //блок конец
  28.  
  29. //блок для вывода ссылок на города в которых есть объявления, в качестве еще одного примера
  30.  
  31. $sql = "SELECT city, published
  32. FROM cms_board_items
  33. WHERE published = 1
  34. GROUP BY city ORDER BY city ASC";
  35.  
  36. $result = $inDB->query($sql);
  37. if ($inDB->num_rows($result)){
  38. while ($item = $inDB->fetch_assoc($result)){
  39. $text .= 'https://'.$c_domain.'/board/city/'.urlencode($item['city'])."\n";
  40. }
  41. }
  42.  
  43. //вывод списка страниц
  44. header('Content-Type: text/plain');
  45. echo $text;
  46.  
  47. ?>
  48.  
  49.  

в файл htaccess  после строки 

  1. RewriteRule ^(.*)$ /index.php [L]

добавляем строку 

  1. Rewriterule ^sitemap\.txt$ /sitemap.php [L]

в файле robots.txt и в панели вебмастера яндекс/гугл указываем ссылку на карту сайта как

сайт.ру/sitemap.txt

открываем эту ссылку в браузере, там должен открыться текстовый файл со списком страниц.

Что удобно, список пополняется новыми ссылками сразу после создания новых страниц, удалённые страницы пропадают из карты — тут же, не нужно использовать крон или запускать генератор карты самому.

Впрочем, если на сайте ну ооочень много ссылок, или задействованы все компоненты, думаю, рациональнее все же использовать типичный генератор, который не будет заново делать запросы ко многим таблицам базы данных при каждом обращении к sitemap

Ещё раз уточню, что в этом примере речь идёт о первой ветке, как это адаптировать под вторую — не подскажу.

Нет комментариев. Ваш будет первым!

Еще от автора

Автопостинг с канала в Telegram в ленту активности сайта (Первая ветка)
В прошлом посте я демонстрировал схему автопостинга сообщений из ленты активности сайта на канале в Telegram.
Автопостинг из ленты активности сайта на канал в телеграм для первой ветки
Заметил на форуме вопрос про автопостинг в телеграм для второй ветки.
Изменения в компоненте «баннеры»: количество, внешний вид, формат ссылки
Немного изменил компонент баннеры. Вместо одного баннера, теперь выводится два подряд.
Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.