プログラミング雑記

sitemap.xmlの作り方 - PHPで動的に作る方法も

楠 剛毅(goke)

個人開発から世界を変えるようなプロダクトづくりを目指しています

はじめに

sitemapはそんなに頻繁に作ることがないのでいつも作り方を忘れてしまいます。基本的にはフォーマットに従って動的に作りたいのでその辺りも踏まえてまとめておきます。

sitemap.xmlのフォーマット

sitemapのフォーマットは下記の通りです。
他にもオプションはありますが、最低限揃えたいのは「url」の中の「loc」と「lastmod」です。

<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
    <url>
        <loc>http://www.example.com/content1</loc>
        <lastmod>2022-11-16T06:00:00+09:00</lastmod>
    </url>
    <url>
        <loc>http://www.example.com/content2</loc>
        <lastmod>2022-11-20T08:00:00+09:00</lastmod>
    </url>
</urlset>

正しいsitemapかはこちらのサイトでもチェックしてもらえます。
また、サイトを巡回して自動でsitemap.xmlを作ってくれるサービスもあるので、今時点のsitemapをポンっと出したい場合は利用してもいいかもしれません。

PHPで動的に出力

上記のようなsitemap.xmlを手動で作ってサーバーに置いておくのも良いのですが、ユーザーがコンテンツを投稿するUGC系のサービスの場合は、sitemapを動的に更新したくなります。
PHPでは、例えば下記のように出力すると良いです。

$query = "select * from content_table";
$stmt = $mysqli->prepare($query);
$stmt->execute();
$result = $stmt->get_result();

/* sitemapを文字列で作成 */
$sitemap = '<?xml version="1.0" encoding="UTF-8"?>' . "\n";
$sitemap = $sitemap . '<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">' . "\n";
while ($row = $result->fetch_assoc()){
    $sitemap = $sitemap . '<url>' . "\n";
    $sitemap = $sitemap . '<loc>';
    $sitemap = $sitemap . $row["content_url"];
    $sitemap = $sitemap . '</loc>' . "\n";
    $sitemap = $sitemap . '<lastmod>';
    $sitemap = $sitemap . date('c', strtotime($row["post_datetime"]));
    $sitemap = $sitemap . '</lastmod>' . "\n";
    $sitemap = $sitemap . '</url>' . "\n";
}
$sitemap = $sitemap . '</urlset>';

/* ファイル書き出し */
$filename = 'sitemap.xml';
$fp = fopen($filename, 'w');
fputs($fp, $sitemap);
fclose($fp);

日付の出力はW3C Datetime 形式に従うことになっているので、date関数のフォーマットを'c'に指定すればいいです。

ちなみに"\n"だけダブルクォーテーションなのは、改行コードはダブルクォーテーションじゃないと効かないためです。たまに忘れてハマることがあるのでメモしておきます。

最後に

PHPを含めたプログラミング言語の年収と習得の難しさをランキングにしてみました。
合わせてご確認ください。

あわせて読みたい
  • この記事を書いた人

楠 剛毅(goke)

個人開発から世界を変えるようなプロダクトづくりを目指しています

-プログラミング雑記