25

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

編集:今、私はコード自体を機能させようとしています。ローカルのテスト サーバーに PHP ファイルとしてセットアップしました。上記のコードが使用されています。現在、何も画面にもソースにも何も表示されません。構文エラーが発生したと思いますが、何も見つかりません。どんな助けでも大歓迎です!

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

4

4 に答える 4

41

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 サーバーがPHP コードを含むべきファイルの拡張子として認識しない.xmlためです。

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

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


別の解決策を追加します:

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

これで、sitemap.xmlURL が得られますが、これは(required ?) ですが、コードは にあるsitemap.phpため、解釈されます。

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

于 2010-04-30T21:33:08.590 に答える
7

私は William のコードを使用しました (ありがとう)。

私は次の行だと思います:

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

一番上の次の 2 行目にある必要があります<?php

ちなみに、それをコピーする他の人へのちょっとしたポイントですが<?php、最初の行の の前に単一のスペース文字があります-私のようにうっかりコピーすると、なぜコードがあなたのために働くことはありません!

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

最後に、出力で変数 $domain を使用して、このコードを (毎回同じテーブル名を使用する場合) 考える必要なくテンプレートとして使用できるようにしました。変数は、データベースに接続するために含まれている 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>
于 2015-12-10T20:48:16.523 に答える