Создание карты сайта sitemap.xml на php

Создание карты сайта sitemap.xml на php

Создание карты сайта sitemap.xml на php

Sitemap — это файл со ссылками на страницы сайта, который сообщает поисковым системам об актуальной структуре сайта.

Основные поддерживаемые форматы поисковыми системами

Яндекс поддерживает форматы
  • XML
  • TXT
В Google поддерживается несколько форматов файлов Sitemap.
  • XML
  • RSS, mRSS и Atom 1.0
  • Текстовый

Формат протокола Sitemap состоит из XML-тегов. Для всех значений данных в файле Sitemap должно использоваться маскирование . В файле необходимо использовать кодировку UTF-8.

Sitemap должен:

  • В начале поставьте открывающий тег < urlset > , а в конце поставьте закрывающий тег </urlset> .
  • Укажите область имен (стандарт протокола) в теге <urlset> .
  • Включите запись < url > для каждого URL-адреса как родительский тег XML.
  • Включите дочернюю запись < loc > для каждого родительского тега <url> .

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

Также все URL-адреса в файле Sitemap должны быть с одного узла, например www.example.com или store.example.com.

Пример XML-файла Sitemap

Ниже приведен пример файла Sitemap, в котором содержится только один URL-адрес и использованы все необязательные теги. Необязательные теги выделены курсивом.

  
    <?xml version="1.0" encoding="UTF-8"?>
        <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
        <url>
            <loc>http://www.example.com/</loc>
            <lastmod>2005-01-01</lastmod>
            <changefreq>monthly</changefreq>
            <priority>0.8</priority>
        </url>
    </urlset>
  
Определения XML-тегов
Атрибут Обязательно Описание
<urlset> обязательный

Инкапсулирует этот файл и указывает стандарт текущего протокола.

<url> обязательный

Родительский тег для каждой записи URL-адреса. Остальные теги являются дочерними для этого тега.

<loc> обязательный

URL-адрес страницы. Этот URL-адрес должен начинаться с префикса (например, HTTP) и заканчиваться косой чертой, если Ваш веб-сервер требует этого. Длина этого значения не должна превышать 2048 символов.

<lastmod> необязательно

Дата последнего изменения файла. Эта дата должна быть в формате W3C Datetime . Этот формат позволяет при необходимости опустить сегмент времени и использовать формат ГГГГ-ММ-ДД.

Обратите внимание, что этот тег не имеет отношения к заголовку "If-Modified-Since (304)", который может вернуть сервер, поэтому поисковые системы могут по-разному использовать информацию из этих двух источников.

<changefreq> необязательно

Вероятная частота изменения этой страницы. Это значение предоставляет общую информацию для поисковых систем и может не соответствовать точно частоте сканирования этой страницы. Допустимые значения:

  • always
  • hourly
  • daily
  • weekly
  • monthly
  • yearly
  • never

Значение"всегда" должно использоваться для описания документов, которые изменяются при каждом доступе к этим документам. Значение "никогда" должно использоваться для описания архивных URL-адресов.

Имейте в виду, что значение для этого тега рассматривается как подсказка , а не как команда. Несмотря на то, что сканеры поисковой системы учитывают эту информацию при принятии решений, они могут сканировать страницы с пометкой "ежечасно" менее часто, чем указано, а страницы с пометкой "ежегодно" – более часто, чем указано. Сканеры могут периодически сканировать страницы с пометкой "никогда", чтобы отслеживать неожиданные изменения на этих страницах.

<priority> необязательно

Приоритетность URL относительно других URL на Вашем сайте. Допустимый диапазон значений — от 0,0 до 1,0. Это значение не влияет на процедуру сравнения Ваших страниц со страницами на других сайтах — оно только позволяет указать поисковым системам, какие страницы, по Вашему мнению, более важны для сканеров.

Приоритет страницы по умолчанию — 0,5.

Следует учитывать, что приоритет, который Вы назначили странице, не влияет на положение Ваших URL на страницах результатов той или иной поисковой системы. Поисковые системы используют эту информацию при обработке URL, которые относятся к одному и тому же сайту, поэтому можно использовать этот тег для увеличения вероятности присутствия в поисковом индексе Ваших самых важных страниц.

Кроме того, следует учитывать, что назначение высокого приоритета всем URL на Вашем сайте не имеет смысла. Поскольку приоритетность – величина относительная, этот параметр используется для того, чтобы определить очередность обработки URL в пределах сайта.

Маскирование символов
Символ Маскирование
Амперсанд & &amp;
Одинарные кавычки ' &apos;
Двойные кавычки " &quot;
Больше > &gt;
Меньше < &lt;

Пример таблицы с постами

Рассмотрит простую таблицу с постами в которой есть параметры дня нашего Sitemap.

База постов

Теперь на основании данной таблицы построим sitemap.xml

Пишем скрипт на php для генерации sitemap.xml

Для генерации sitemap.xml с помощью php убедитесь, что у вас включено расширение xmlwriter

XMLWriter является модулем PHP. Он создаёт xmlWriter API на основе библиотеки libxml.

Модуль представляет собой класс-писатель, который является некэшируемым, однонаправленным средством генерирования потоков или файлов, содержащих данные XML.

Модуль может быть использован в объектно-ориентированном либо в процедурном стилях. Каждый документированный метод описывает альтернативные процедурные вызовы.

    
      <?php

      //Отправляем заголовок с указанием что у нас XML документ
      header('Content-Type: application/xml; charset=utf-8');

      //Константа нашего хоста сайта
      define('HOST', 'https://'. $_SERVER['HTTP_HOST'] .'/');

      //Подключаемся к базе данных
      $dbh = new PDO('mysql:dbname=test;host=localhost', 'root', 'root');

      // Получение статей из базы данных.
      $sql = 'SELECT *, DATE_FORMAT(`createt_at`, "%Y-%m-%d") AS `date` FROM `posts`';
      $sth = $dbh->prepare($sql);
      $sth->execute();
      $posts = $sth->fetchAll(PDO::FETCH_OBJ);

      //Включаем буферизацию вывода
      ob_start();

      /**
      * Создаем объект XMLWriter()
      * Убедитесь что у вас включено соответствующее расширение для PHP
      * */
      $writer = new \XMLWriter();
      $writer->openURI('php://output');
      $writer->startDocument('1.0', 'UTF-8');

      $writer->startElement('urlset');
      $writer->writeAttribute('xmlns', 'http://www.sitemaps.org/schemas/sitemap/0.9');

      foreach($posts as $items){
          $writer->startElement('url');

              $writer->writeElement('loc',htmlspecialchars(HOST . $items->alias));
              $writer->writeElement('lastmod', $items->date);
              $writer->writeElement('changefreq', $items->changefreq);
              $writer->writeElement('priority', $items->priority);

          $writer->endElement();
      }

      $writer->endElement();

      $writer->endDocument();

      //Очищаем буфер, отдаем содержимое
      echo ob_get_clean();
      ?>
    
  

Создаем правило .htaccess для перенаправления с sitemap.php на sitemap.xml

Внимание:

Если данный скрипт лежит у вас в корне сайта с именем sitemap.php, вы хотите чтобы он открывался по адресу https://example.com/sitemap.xml. В файле .htaccess нужно добавить запись:

    
      RewriteEngine On
      RewriteRule ^sitemap.xml$ sitemap.php [L,QSA]
    
  

Добавляем директиву Sitemap в robots.txt

Чтобы поисковые системы знали где расположен файл карты сайта нужно добавить директиву Sitemap в robots.txt:

    
      User-agent: *
      Sitemap: https://example.com/sitemap.xml
    
  

Теги
Поддержи проект:

No-name
sergej
куда пропал у тебя хороший сайт давно не было интересных плюшек

19/12/2023 15:41:44

Админ
Админ

Спасибо, что не забываете, но времени не хватает. Наполняю по мере возможности.

07/02/2024 13:43:55

No-name
Вячеслав
Привет! Классные и понятные статьи. Ко всем статьям по PHP очень хорошо бы вписалась статейка о том как сделать постраничную навигацию. Да, в инете много инфы но у вас лучше получается доносить инфу! Если что, буду рад почитать!))

08/12/2022 16:17:04

Админ
Админ

Спасибо за отзыв, возможно на новогодних праздниках будет свободное время и я посвящу себя новым статьям.

12/12/2022 13:05:07


Copyright © 2014 - 2024 All rights reserved.