web-dev-qa-db-ja.com

PHPを使用してXMLサイトマップを作成する

自動的に更新されるサイトマップを作成しようとしています。 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(DBからプルされたものなど)が生成されず、サイトマップが検証されないことです。ありがとう!

EDIT:現時点では、コード自体を機能させようとしています。ローカルテストサーバーでPHPファイルとして設定しました。上記のコードが使用されています。現時点では、何も画面にもソースにも表示されません。構文エラーを犯したと思っていますが、何も見つかりません。どんな助けもありがたいです!

編集2:わかりました。どうやら、私はPHPでXML宣言をエコーする必要がありました。最終的なコードは上記に掲載されています。ご協力いただきありがとうございます!

16
williamg

生成された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コードが解釈されないことを示しています


これはおそらくWebサーバーが.xmlをPHP code

少なくとも2つの可能な解決策:

  • サーバーを再構成して、XMLファイルがPHP=インタプリタを通過するようにします(これはあまり良い考えではないかもしれません。既存のファイルで問題が発生する可能性があります!)
  • サーバーによって解釈されるように、サイトマップの拡張子をsitemap.phpなどに変更します。


別のソリューションを追加します:

  • コードを含むsitemap.phpファイルを用意する
  • そしてRewriteRuleを使用して、sitemap.xml URLが実際にsitemap.phpファイルを指すようにします

これで、ニース(必須?)であるsitemap.xml URLが得られますが、コードはsitemap.phpにあるため、解釈されます。

Apacheのmod_rewriteを参照してください。

32
Pascal MARTIN

私はウィリアムのコードを使用しました(ありがとう)といくつかの小さな変更を加えるとうまくいきました。

私は次のように思います:

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

上から2行目<?php

ちなみに、それをコピーする他の人への小さなポイントですが、最初の行の<?phpの前に単一のスペース文字があります-私がしたように不注意でコピーした場合、コードが機能しない理由を理解してください!

MySql selectステートメントも少し調整する必要がありました。

最後に、出力では変数$ domainを使用したので、このコードを考える必要なしにテンプレートとして使用できます(毎回同じテーブル名を使用する場合)。 variabeは、データベースに接続するために含まれているconnectdb.phpファイルに追加されます。

これが、Williamのコードの実際のバージョンです。

<?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>
5
Chris9

最善の解決策は、Apache .htaccessファイルのRewriteEngine Onの後に次の行を追加することです。

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

次に、ルートフォルダーにファイルsitemap.phpを置くだけで、通常はすべての検索エンジンが最初に検索するデフォルトのURLであるhttp://yoursite.com/sitemap.xmlを介してアクセスできます。

ファイルsitemap.php

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

できます :)