Создание XML-карты сайта с помощью PHP - PullRequest
15 голосов
/ 01 мая 2010

Я пытаюсь создать карту сайта, которая будет автоматически обновляться. Я сделал что-то похожее на мой канал RSS, но эта карта сайта отказывается работать. Вы можете просмотреть его в прямом эфире на 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-адреса (например, извлеченные из БД) не генерируются и карта сайта не будет проверяться. Спасибо!

РЕДАКТИРОВАТЬ: Прямо сейчас, я просто пытаюсь заставить сам код работать. Я настроил его как файл PHP на моем локальном тестовом сервере. Код выше используется. Прямо сейчас ничего не отображается на экране или в источнике. Я думаю, что сделал синтаксическую ошибку, но я ничего не могу найти. Любая помощь приветствуется!

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

Ответы [ 3 ]

31 голосов
/ 01 мая 2010

Если вы посмотрите на 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

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

См. Apache mod_rewrite.

5 голосов
/ 10 декабря 2015

Я использовал код Уильяма (спасибо), и с небольшими изменениями он работал для меня.

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

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 голосов
/ 27 февраля 2017

Лучшее решение - добавить в ваш файл 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"?>' ?>

работает:)

...