Создание XML-карты сайта с PHP

Я пытаюсь создать файл Sitemap, который будет автоматически обновляться. Я сделал что-то похожее на мой RSS-канал, но этот файл Sitemap отказывается работать. Вы можете просмотреть его в прямом эфире http://designdeluge.com/sitemap.xml Я думаю, что основная проблема заключается в том, что он не распознает PHP-код. Здесь полный источник:

 <?php 


include 'includes/connection.php';

header("Content-type: text/xml");

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

?>

<urlset xmlns="http://www.google.com/schemas/sitemap/0.84" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.google.com/schemas/sitemap/0.84 http://www.google.com/schemas/sitemap/0.84/sitemap.xsd">

    <url>
        <loc>http://designdeluge.com/</loc>
        <lastmod>2010-04-20</lastmod>
        <changefreq>weekly</changefreq>
        <priority>1.00</priority>
    </url>

    <url>
        <loc>http://designdeluge.com/about.php</loc>
        <lastmod>2010-04-20</lastmod>
        <changefreq>never</changefreq>
        <priority>0.5</priority>
    </url>

    <?php

    $entries = mysql_query("SELECT * FROM Entries");

    while($row = mysql_fetch_assoc($entries)) {
    $title = stripslashes($row['title']);
    $date = date("Y-m-d", strtotime($row['timestamp']));

    echo "

    <url>
        <loc>http://designdeluge.com/".$title."</loc>
        <lastmod>".$date."</lastmod>
        <changefreq>never</changefreq>
        <priority>0.8</priority>
    </url>";

 } ?>

</urlset>

Проблема заключается в том, что динамический URL (например, те, что вытащил из БД) не генерируются и карта сайта не будет проверяться. Спасибо!

EDIT:. Сейчас я просто пытаюсь заставить сам код работать. Я настроил его как файл PHP на моем локальном сервере тестирования. Используется код выше. Сейчас ничего не отображается ни на экране, ни в источнике. Я думаю, что я сделал синтаксическую ошибку, но ничего не могу найти. Любая помощь приветствуется!

РЕДАКТИРОВАТЬ 2: Хорошо, я разобрался с парнями. По-видимому, мне пришлось отменить XML-объявление с помощью PHP. Окончательный код размещен выше. Спасибо за вашу помощь!

Ответы

Ответ 1

Если вы посмотрите на sitemap.xml, сгенерированный (например, с использованием источника просмотра в вашем браузере), вы увидите следующее:

<?php header('Content-type: text/xml'); ?>
<?xml version="1.0" encoding="UTF-8" ?>
<urlset xmlns="http://www.google.com/schemas/sitemap/0.84" xmlns:xsi="http:/
...

<?php, присутствующий в этом выпуске, показывает, что PHP-код не интерпретируется.


Вероятно, это связано с тем, что ваш веб-сервер не распознает .xml как расширение файлов, содержащих PHP-код.

Как минимум два возможных решения:

  • Переконфигурируйте свой сервер, поэтому XML файлы проходят через интерпретатор PHP (может быть, не такая хорошая идея: это может вызвать проблемы с существующими файлами!)
  • Измените расширение вашей карты сайта, например, на sitemap.php, поэтому оно интерпретируется вашим сервером.


Я бы добавил еще одно решение:

  • Имеет файл sitemap.php, содержащий код
  • И используйте RewriteRule, поэтому URL sitemap.xml фактически указывает на файл sitemap.php

При этом у вас будет URL sitemap.xml, который является хорошим (обязательно?), но поскольку код будет в sitemap.php, он будет интерпретироваться.

См. Apache mod_rewrite.

Ответ 2

Я использовал код William (спасибо) и несколько небольших модификаций, которые он работал у меня.

Я думаю, что строка:

header("Content-type: text/xml");

должна быть вторая строка после верхнего <?php

Кстати, всего лишь небольшая точка для всех, кто ее копирует, но перед <?php в первой строке есть один пробел, если вы невольно копируете его, как я, вы потратите немного времени, пытаясь выяснить, почему код не будет работать для вас!

Мне также пришлось немного подбирать инструкцию выбора MySql.

Наконец, на выходе я использовал переменную $domain, чтобы этот фрагмент кода можно использовать в качестве шаблона без необходимости думать об этом (при условии, что вы используете одно и то же имя таблицы каждый раз). Variabe добавляется в файл connectdb.php, который включен для подключения к базе данных.

Вот моя рабочая версия кода Уильяма:

<?php 
header("Content-type: text/xml");
echo '<?xml version="1.0" encoding="UTF-8" ?>';
include 'includes/connectdb.php';
?>

<urlset xmlns="http://www.google.com/schemas/sitemap/0.84" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.google.com/schemas/sitemap/0.84 http://www.google.com/schemas/sitemap/0.84/sitemap.xsd">

    <url>
        <loc>http://www.DOMAIN.co.uk/</loc>
        <priority>1.00</priority>
    </url>

    <?php

    $sql = "SELECT * FROM pages WHERE onshow = 1 ORDER BY id ASC";
    $result = mysql_query($sql,$conn);      
    while($row = mysql_fetch_array($result))
    { 
    $filename = stripslashes($row['filename']);
    ?>
    <url>
        <loc>http://www.<?php echo "$domain"; ?>/<?php echo "$filename" ?></loc>
        <changefreq>monthly</changefreq>
        <priority>0.5</priority>
    </url>

 <?php } ?>

</urlset>

Ответ 3

Лучшее решение - добавить в файл apache .htaccess следующую строку после RewriteEngine On

RewriteRule ^sitemap\.xml$ sitemap.php [L]

а затем просто имея файл sitemap.php в вашей корневой папке, который обычно доступен через http://yoursite.com/sitemap.xml, URL-адрес по умолчанию, в который будут сначала искать все поисковые системы.

Файл sitemap.php начинается с

<?php header('Content-type: application/xml; charset=utf-8') ?>
<?php echo '<?xml version="1.0" encoding="UTF-8"?>' ?>

он работает:)