PHP класс генератор файла Sitemap.xml

Обзор PHP класса SitemapGenerator для генерации XML файла sitemap. Пояснения работы кода.

Генератор 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Ответ AI ChatGPT: Предлагаю по Вашему запросу: Класс для формирования и записи файла sitemap.xml на основе данных из таблицы `public` в базе данных MySQL:

PHP
<?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();

Пример использования:

PHP
$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
<?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;
    }
}

Приблизительная структура файла настроек:

HTML
;Данные базы 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"

Запускаем функцию генерации, а результат для контроля можно вывести на страницу:

PHP
$generator = new SitemapGenerator();
$sitemap = $generator->generateSitemap();
echo str_replace(PHP_EOL, '<br>', $sitemap);

Сначала объявляем в классе приватные переменные, потом в конструкторе получаем данные из файла настроек и присваеваем переменным значения. Запускаем функцию генератора и полученный код XML записываем в файл. Функция отдает XML строку результата.

Дата публикации: 

ТОП 10 случайных публикаций



Сайт разработан студией © WEB-VidST   


Яндекс.Метрика