PHP класс генератор файла Sitemap.xml
Обзор PHP класса SitemapGenerator для генерации XML файла sitemap. Пояснения работы кода.
Сегодня каснёмся темы генерации XML файла sitemap. О его предназанчении и особенностях форматов я уже писал в прошлой статье: "SITEMAP – карта вашего сайта" и в продолжение этой темы выкладываю php класс "SitemapGenerator" генератора файла sitemap.xml первоначально написанного с помощью уже привычного нам AI ChatGPT. Класс будет полезен для установки на самописные системы управления контентом.
Вопрос к AI ChatGPT: Нужен php класс который формирует и записывает файл sitemap.xml. Данные берутся из базы данных mysql в таблице `public`, ряды: `canonical` - - канонический URL страницы без протокола https:// и http://, `nameRus`- имя страницы, `titleStr` - строка для тега `title`, `publik` - (varchar) имеет значения `yes` или `no` - разрешить/запретить публикацию соответственно, `textMini` - текст метатега description, `date` (формат Y-m-d H:i:s) - дата время публикации записи.
Ответ AI ChatGPT: Предлагаю по Вашему запросу: Класс для формирования и записи файла sitemap.xml на основе данных из таблицы `public` в базе данных MySQL:
<?php class SitemapGenerator { private $mysqli; private $baseUrl; private $sitemapPath; public function __construct($host, $username, $password, $dbName, $baseUrl, $sitemapPath) { $this->mysqli = new mysqli($host, $username, $password, $dbName); $this->baseUrl = $baseUrl; $this->sitemapPath = $sitemapPath; } public function generateSitemap() { // Fetch data from database $query = "SELECT canonical, name_rus, title_str, text_mini, data_a FROM publics WHERE publik='yes'"; $result = $this->mysqli->query($query); // Generate sitemap XML $xml = '<?xml version="1.0" encoding="UTF-8"?>/n'; $xml .= '<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">/n'; while ($row = $result->fetch_assoc()) { $xml .= '<url>/n'; $xml .= '<loc>' . $this->baseUrl . $row['canonical'] . '</loc>/n'; $xml .= '<lastmod>' . date('c', strtotime($row['data_a'])) . '</lastmod>/n'; $xml .= '<changefreq>monthly</changefreq>/n'; $xml .= '<priority>0.5</priority>/n'; $xml .= '<title>' . $row['title_str'] . '</title>/n'; $xml .= '<description>' . $row['text_mini'] . '</description>/n'; $xml .= '</url>/n'; } $xml .= '</urlset>/n'; // Write sitemap XML to file file_put_contents($this->sitemapPath, $xml); } } // Example usage $generator = new SitemapGenerator('localhost', 'username', 'password', 'database_name', 'https://example.com/', '/path/to/sitemap.xml'); $generator->generateSitemap();
Пример использования:
$generator = new SitemapGenerator('localhost', 'username', 'password', 'database_name', 'https://example.com/', '/path/to/sitemap.xml'); $generator->generateSitemap();
Замените localhost, username, password, database_name на соответствующие значения для доступа к вашей базе данных MySQL. Замените https://example.com/ на базовый URL вашего сайта и /path/to/sitemap.xml на путь к файлу sitemap.xml на вашем сервере.
Код в принципе рабочий, правда есть маленький ньюанс с приватной переменной baseUrl. Так как у меня в базе канонические адреса страниц записаны без протокола "https://" то в baseUrl я передаю только значение протокола без имени домена. Так же можно исключить из кода метатанные `description` это особо не противоречит формату sitemap и может присутствовать на усмотрение вебмастера.
Конечно для своих нужд я немного изменил функцию __construct, чтобы данные для подключения к базе брались из файла настроек config.ini. И вот, что получилось:
<?php class SitemapGenerator { private $mysqli; private $baseUrl; private $sitemapConf; private $sitemapPath; public function __construct() { $dirhome=self::FileDir('configALL/config.ini'); $inimass = parse_ini_file($dirhome['fullpath'], true); $this->mysqli = new mysqli($inimass['connect']['host'], $inimass['connect']['user'], $inimass['connect']['pass'], $inimass['connect']['baza']); $this->sitemapConf = $inimass['sitemap']; $this->sitemapPath = $dirhome['fulldir'] . $this->sitemapConf['pathtoxml']; } public function FileDir($index = "index.html"){ //Парсим URL, путь от корня и обрезаем первый слеш $index = ltrim(parse_url($index, PHP_URL_PATH), '/'); $dirFile = __FILE__; $abs = ''; $infodir[]=""; $ns = substr_count($dirFile, '/'); while ($ns > 1){ $dirFile = trim(dirname($dirFile) . PHP_EOL); $filename = $dirFile."/".$index; if (file_exists($filename)){ $infodir['fulldir']=$dirFile; $infodir['fullpath']=$dirFile."/".$index; $infodir['relativepath']=$abs.$index; $infodir['pathbias']= $abs; return $infodir; }else{ $infodir['fulldir']=$dirFile; $infodir['fullpath']=0; $infodir['relativepath']= 0; $infodir['pathbias']= 0;//Путь смещения } $abs .= '../'; $ns--; } return $infodir; } public function generateSitemap() { // Fetch data from database $query = "SELECT canonical, nameRus, titleStr, textMini, date FROM publics WHERE publik='yes'"; $result = $this->mysqli->query($query); // Generate sitemap XML $xml = '<?xml version="1.0" encoding="UTF-8"?>/n'; $xml .= '<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">/n'; while ($row = $result->fetch_assoc()) { $xml .= '<url>/n'; $xml .= '<loc>' . $this->sitemapConf['protocol'] . $row['canonical'] . '</loc>/n'; $xml .= '<lastmod>' . date('c', strtotime($row['date'])) . '</lastmod>/n'; $xml .= '<changefreq>' . $this->sitemapConf['changefreq'] . '</changefreq>/n'; $xml .= '<priority>' . $this->sitemapConf['priority'] . '</priority>/n'; $xml .= '<title>' . $row['titleStr'] . '</title>/n'; $xml .= '<description>' . $row['textMini'] . '</description>/n'; $xml .= '</url>/n'; } $xml .= '</urlset>/n'; // Write sitemap XML to file file_put_contents($this->sitemapPath, $xml); return $xml; } }
Приблизительная структура файла настроек:
;Данные базы masql [connect] baza = "baza_name" user = "user_login" pass = "password" host = "localhost" ;sitemap.xml [sitemap] protocol = "https://" pathtoxml = "/sitemap.xml" changefreq = "monthly" priority = "0.5"
Запускаем функцию генерации, а результат для контроля можно вывести на страницу:
$generator = new SitemapGenerator(); $sitemap = $generator->generateSitemap(); echo str_replace(PHP_EOL, '<br>', $sitemap);
Сначала объявляем в классе приватные переменные, потом в конструкторе получаем данные из файла настроек и присваеваем переменным значения. Запускаем функцию генератора и полученный код XML записываем в файл. Функция отдает XML строку результата.
Дата публикации: