Генератор карты сайта (SiteMap.xml) на PHP

Форум для тех кто начинает осваивать язык php.
Аватара пользователя
Местный бот
Сообщения: 153

Генератор карты сайта (SiteMap.xml) на PHP

Сообщение Местный бот » Пн мар 09, 2015 8:28 pm

Добрый вечер.
Прошу, объясните на пальцах, как сделать скрипт, что бы он генерировал карту сайта, файл sitemap.xml?
Какие функции для этого лучше использовать и как?
Заранее благодарен.

Навигация по теме: Генерация SiteMap.xml по нажатию кнопки
<php
// Понравилось? Жми большой палец вверх.
// Местный бот 2014 - 2016 ©

echo 'Большой Привет от Местного бота!';
Реклама
Аватара пользователя
Slash
Администратор
Сообщения: 2029
Поблагодарили: 62 раза

Re: Генератор карты сайта (SiteMap.xml) на PHP

Сообщение Slash » Вт мар 10, 2015 8:56 pm

Получаем адрес страницы, скажем если адрес страницы состоит из id статьи и выглядит так: page=12. Вставляем id статьи к уже дописанному адресу, так: http://site.ru/page=' . $id . '. Затем открываем файл sitemap.xml и вставляем код, сохраняем и закрываем. Вот в принципе и всё...
Функции, которые пригодится:
  • fopen() - открытие файла.
  • fwrite() - запись в файл.
  • fgets() - закрытие файла.
Генератор SiteMap.xml, как то так:

Код: Выделить всё

<?php 
$sitemap 
= 'sitemap.xml';
$file = fopen($sitemap, 'a'); # Открываем файл для записи
$xml = '    <url>
        <loc>http://site.ru/page='
 . $id . '</loc>
        <lastmod>2012-10-27T03:32:36+00:00</lastmod>
        <changefreq>daily</changefreq>
        <priority>0.5</priority>
    </url>'
; # Создаём код для вставки в файл
$write = fwrite($file, $xml); # Записываем код в файл
fclose($file); # Закрываем файл  

В итоге получаем файл SiteMap.xml с содержимым:

Код: Выделить всё

    <url>
        <
loc>http://site.ru/page=12</loc>
        
<lastmod>2012-10-27T03:32:36+00:00</lastmod>
        <
changefreq>daily</changefreq>
        <
priority>0.5</priority>
    </
url

В ручную можно дописать, в самом верху:

Код: Выделить всё

<?xml version="1.0" encoding="UTF-8" ?>

Можно добавить проверку записи файла, для этого в php код после:

Код: Выделить всё

fclose($file); # Закрываем файл  

добавить:

Код: Выделить всё

if (!$write)
{
    echo 'Ошибка записи файла.'; 
}
else
{
    echo 'Файл успешно записан!';
}

Думаю объяснил более, чем на пальцах...
Аватара пользователя
Slash
Администратор
Сообщения: 2029
Поблагодарили: 62 раза

Re: Генератор карты сайта (SiteMap.xml) на PHP

Сообщение Slash » Ср мар 11, 2015 12:56 pm

Для скрипта выше можно сделать проверку на существование файла (карты sitemap.xml), и если файл не существует то создать его. Делаем так: после:

Код: Выделить всё

$sitemap 'sitemap.xml'

добавляем:

Код: Выделить всё

if (!file_exists($sitemap)) 
{
    
$creation fopen($sitemap'w');
    if (!
$creation)
    {
        exit(
'Невозможно создать карту сайта. Создайте файл sitemap.xml вручную.');
    }
Аватара пользователя
Местный бот
Сообщения: 153

Re: Генератор карты сайта (SiteMap.xml) на PHP

Сообщение Местный бот » Пт мар 13, 2015 11:33 am

Спасибо, все работает!
Но есть еще один вопрос. Вот данный скрипт добавляет по одной ссылке в карту, этот скрипт можно прикрутить к другому скрипту и при добавлении статьи новой статьи будет добавляться ссылка в карту. А как записать ссылки уже существующих статей?
Их много и вручную писать очень долго.
<php
// Понравилось? Жми большой палец вверх.
// Местный бот 2014 - 2016 ©

echo 'Большой Привет от Местного бота!';
Аватара пользователя
Slash
Администратор
Сообщения: 2029
Поблагодарили: 62 раза

Re: Генератор карты сайта (SiteMap.xml) на PHP

Сообщение Slash » Пт мар 13, 2015 1:12 pm

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

Код: Выделить всё

$id = array # Массив с id статьями 
(
    
78563,
    
23,
    
88,
    
12
    
652,
    
1000,
    
444,
    
2505
); 

Далее, в нашем скрипте меняем:

Код: Выделить всё

$xml '    <url>
        <loc>http://site.ru/page=' 
$id '</loc>
        <lastmod>2012-10-27T03:32:36+00:00</lastmod>
        <changefreq>daily</changefreq>
        <priority>0.5</priority>
    </url>'
# Создаём код для вставки в файл
$write fwrite($file$xml); # Записываем код в файл 

на:

Код: Выделить всё

foreach ($id as $value# Записываем все ссылки на статьи в файл
{
    
$xml '    <url>
        <loc>http://site.ru/page=' 
$value '</loc>
        <lastmod>2012-10-27T03:32:36+00:00</lastmod>
        <changefreq>daily</changefreq>
        <priority>0.5</priority>
    </url>'
# Создаём код для вставки в файл    
    
$write fwrite($file$xml); # Записываем код в файл

Вот и всё! Весь код, согласно всем правкам в теме:

Код: Выделить всё

$sitemap 'sitemap.xml';
if (!
file_exists($sitemap))
{
    
$creation fopen($sitemap'w');
    if (!
$creation)
    {
        exit(
'Невозможно создать карту сайта. Создайте файл sitemap.xml вручную.');
    }
}
$file fopen($sitemap'a'); # Открываем файл для записи
foreach ($id as $value# Записываем все ссылки на статьи в файл
{
    
$xml '    <url>
        <loc>http://site.ru/page=' 
$value '</loc>
        <lastmod>2012-10-27T03:32:36+00:00</lastmod>
        <changefreq>daily</changefreq>
        <priority>0.5</priority>
    </url>'
# Создаём код для вставки в файл    
    
$write fwrite($file$xml); # Записываем код в файл
}
fclose($file); # Закрываем файл
if (!$write)
{
    echo 
'Ошибка записи файла.'
}
else
{
    echo 
'Файл успешно записан!';

Карта получается такого вида:

Код: Выделить всё

    <url>
        <
loc>http://site.ru/page=78563</loc>
        
<lastmod>2012-10-27T03:32:36+00:00</lastmod>
        <
changefreq>daily</changefreq>
        <
priority>0.5</priority>
    </
url>    <url>
        <
loc>http://site.ru/page=23</loc>
        
<lastmod>2012-10-27T03:32:36+00:00</lastmod>
        <
changefreq>daily</changefreq>
        <
priority>0.5</priority>
    </
url>    <url>
        <
loc>http://site.ru/page=88</loc>
        
<lastmod>2012-10-27T03:32:36+00:00</lastmod>
        <
changefreq>daily</changefreq>
        <
priority>0.5</priority>
    </
url

Если требуется каждый тег <url> с новой строки, замените строчку:

Код: Выделить всё

    </url>'; # Создаём код для вставки в файл

на:

Код: Выделить всё

    </url>' . "\r\n"; # Создаём код для вставки в файл

После этой замены, исходник карты будет выглядеть так:

Код: Выделить всё

    <url>
        <
loc>http://site.ru/page=78563</loc>
        
<lastmod>2012-10-27T03:32:36+00:00</lastmod>
        <
changefreq>daily</changefreq>
        <
priority>0.5</priority>
    </
url>
    <
url>
        <
loc>http://site.ru/page=23</loc>
        
<lastmod>2012-10-27T03:32:36+00:00</lastmod>
        <
changefreq>daily</changefreq>
        <
priority>0.5</priority>
    </
url>
    <
url>
        <
loc>http://site.ru/page=88</loc>
        
<lastmod>2012-10-27T03:32:36+00:00</lastmod>
        <
changefreq>daily</changefreq>
        <
priority>0.5</priority>
    </
url
Аватара пользователя
Slash
Администратор
Сообщения: 2029
Поблагодарили: 62 раза

Re: Генератор карты сайта (SiteMap.xml) на PHP

Сообщение Slash » Сб мар 14, 2015 9:18 am

Подумал, что некоторые статьи со временем могут быть удалены или их id по каким то причинам был изменен, пересохранили так сказать. По этому решил сделать создание карты, каждый раз с пустого файла, то есть каждый раз карта будет переписываться по новому, благодаря чему на карте не будет несуществующих ссылок. Добавил кнопку Сгенерировать карту, по нажатию которой скрипт будет запущен в работу, это на много удобней, можно вставить в административную панель. Исправил пару ошибок, которые были в коде. А так же, теперь в фале sitemap.xml автоматом прописываются теги:

Код: Выделить всё

<?xml version="1.0" encoding="UTF-8" ?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">

в самом верху, и: </urlset> в самом низу, можно сказать, что карта получается полностью готовая.
Сам скрипт:

Код: Выделить всё

echo '<form action="index.php" method="post">';
echo '<input type="submit" name="submit" value="Сгенерировать карту" />';
echo '</form>';

if (isset($_POST['submit']))
{
    $sitemap = 'sitemap.xml';
    $action = fopen($sitemap, 'w'); # Если файла нет, создаём его. Если файл есть, заменяем его на новый, пустой
    if (!$action)
    {
        exit('Невозможно создать карту сайта.');
    }

    $file = fopen($sitemap, 'a'); # Открываем файл для записи
    $xml = "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\r\n";
    
$xml .= "<urlset xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\">\r\n";
    foreach (
$id as $value# Записываем все ссылки на статьи в файл
    
{
        
$xml .= "    <url>\r\n";
        
$xml .= "        <loc>http://site.ru/page=" $value "</loc>\r\n";
        
$xml .= "        <lastmod>" date('Y-m-d') . "</lastmod>\r\n";
        
$xml .= "        <changefreq>daily</changefreq>\r\n";
        
$xml .= "        <priority>0.5</priority>\r\n";
        
$xml .= "    </url>\r\n"# Создаём код для вставки в файл    

    
}
    
$xml .= '</urlset>';
    
$write fwrite($file$xml); # Записываем код в файл
    
fclose($file); # Закрываем файл
    
if (!$write)
    {
        echo 
'Ошибка записи файла.'
    }
    else
    {
        echo 
'Файл успешно записан!';
    }
    
    
# Удаляем переменные для освобождения памяти
    
unset($sitemap$action$file$xml$write);    
}

Пример карты:

Код: Выделить всё

<?xml version="1.0" encoding="UTF-8" ?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
    <url>
        <loc>http://site.ru/page=1</loc>
        <lastmod>2015-03-14</lastmod>
        <changefreq>daily</changefreq>
        <priority>0.5</priority>
    </url>
    <url>
        <loc>http://site.ru/page=2</loc>
        <lastmod>2015-03-14</lastmod>
        <changefreq>daily</changefreq>
        <priority>0.5</priority>
    </url>
</urlset>

Вернуться в «PHP»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость