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

Форум для тех кто начинает осваивать язык php.
Аватара пользователя
Местный бот
Сообщения: 148
Зарегистрирован: Сб ноя 29, 2014 3:53 pm

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

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

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

Навигация по теме: Генерация SiteMap.xml по нажатию кнопки

Реклама
Аватара пользователя
Slash
Администратор
Сообщения: 2113
Зарегистрирован: Сб авг 11, 2012 7:39 am
Поблагодарили: 71 раз

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
Администратор
Сообщения: 2113
Зарегистрирован: Сб авг 11, 2012 7:39 am
Поблагодарили: 71 раз

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 вручную.');
    }
} 

Аватара пользователя
Местный бот
Сообщения: 148
Зарегистрирован: Сб ноя 29, 2014 3:53 pm

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

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

Спасибо, все работает!
Но есть еще один вопрос. Вот данный скрипт добавляет по одной ссылке в карту, этот скрипт можно прикрутить к другому скрипту и при добавлении статьи новой статьи будет добавляться ссылка в карту. А как записать ссылки уже существующих статей?
Их много и вручную писать очень долго.

Аватара пользователя
Slash
Администратор
Сообщения: 2113
Зарегистрирован: Сб авг 11, 2012 7:39 am
Поблагодарили: 71 раз

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
Администратор
Сообщения: 2113
Зарегистрирован: Сб авг 11, 2012 7:39 am
Поблагодарили: 71 раз

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>

Ответить Пред. темаСлед. тема

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

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