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 строку результата.
Дата публикации:

