XML形式サイトマップsitemap.xmlをPHPで自作する方法
Posted: Last Update:
Google Search ConsoleやBing Web Masterに登録するサイトマップ「sitemap.xml」を作りたい!でも、どこから手をつけていいのか分からない…。そんな方に向けて、この記事では「sitemap.xml」の形式や、PHPでの作成方法を詳しく紹介します。これさえ読めば、「sitemap.xml」をPHPで自作できるようになります!
この記事の目次
sitemap.xmlとは
Google Search ConsoleやBing Web Masterにサイトの登録すると、「サイトマップ」の登録を促されます。数あるサイトマップ形式の中でも、GoogleやBingが最初に挙げているのがXML形式のサイトマップ「sitemap.xml」です。このサイトマップをGoogleやBingに提供することで、自分のサイトを効率よくクロールしてもらうことが可能になります。
サイトマップについて詳しく知りたい方は「GoogleやBingに登録するサイトマップとは?一番簡単に作れるサイトマップも紹介!」をご参照ください。
sitemap.xmlとは
XML形式のサイトマップ「sitemap.xml」。「sitemap.xml」は、サイト内のURLを網羅するサイトマップで、様式は「sitemaps.org」が定めています。
sitemap.xmlの内容
sitemap.xmlの内容は、sitemaps.orgの「サイトマップの XML 形式」にまとめられています。15,000字に近いこの文書を読むのは大変なので、最低限欲しい項目を書き出してみました。
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<url>
<loc>ページのURL1</loc>
<lastmod>URL1更新日</lastmod>
</url>
<url>
<loc>ページのURL2</loc>
<lastmod>URL2更新日</lastmod>
</url>
・
・
・
</urlset>
「<url>~</url>」の間に、サイトのページを1つずつ書き出し、必要な数だけ繰り返します。
sitemap.xmlをPHPで作成する利点
サイトマップは、ページを増やすごとにアップデートするのが理想です。上記のようなサイトマップを手動で毎回アップデートするのは大変ですが、PHPを利用すれば簡単にサイトマップを作成することができます。サイトの更新をした際にPHPを実行すれば、いつでもsitemap.xmlを最新の状態に保つことが可能です。
sitemap.xmlを作成するPHPコード
では、早速sitemap.xmlを自動作成するPHPのサンプルをお見せしましょう。詳細については続けて詳しくご説明します。ご自身のサイトに合わせて変更が必要になりますので、PHPを初めて利用される方はぜひご確認ください。
$myurl ="https://example.com";
$mypath = dirname(__FILE__);
$folders = array("folder1","folder2","folder3");
$fp = fopen("$mypath/sitemap.xml", "w");
fwrite($fp, '<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<url><loc>'.$myurl.'</loc><lastmod>'.date("Y-m-d").'</lastmod></url>
');
foreach($folders as $folder){
$files = glob("$mypath/$folder/*.html");
foreach($files as $filename){
$filename = basename($filename);
$filemodified = date("Y-m-d", filemtime("$mypath/$folder/$filename"));
$siteinfo = '<url><loc>'.$myurl.'/'.$folder.'/'.$filename.'</loc><lastmod>'.$filemodified.'</lastmod></url>';
fwrite($fp , $siteinfo."\n");
}
}
fwrite($fp, '</urlset>');
fclose($fp);
?>
sitemap.xmlを作成するPHPコード解説
ここでは、上で紹介したPHPのコードについて詳しく解説していきます。分かる部分については、どんどん読み飛ばしていただいて問題ありません。
PHPに詳しくない方は、ご自身のサイトに合わせて内容を変更し、「createxmlsitemap.php」などの名前でルートディレクトリ(index.htmlやindex.phpと同じ階層)に保存してみてください。なお、下記の説明は、ルートディレクトリにPHPを保存することを前提としています。
PHPの開始と終了
PHPを利用する際には、下記でハイライトしたように、PHPの開始と終了を宣言します。
$myurl ="https://example.com";
$mypath = dirname(__FILE__);
$folders = array("folder1","folder2","folder3");
$fp = fopen("$mypath/sitemap.xml", "w");
fwrite($fp, '<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<url><loc>'.$myurl.'</loc><lastmod>'.date("Y-m-d").'</lastmod></url>
');
foreach($folders as $folder){
$files = glob("$mypath/$folder/*.html");
foreach($files as $filename){
$filename = basename($filename);
$filemodified = date("Y-m-d", filemtime("$mypath/$folder/$filename"));
$siteinfo = '<url><loc>'.$myurl.'/'.$folder.'/'.$filename.'</loc><lastmod>'.$filemodified.'</lastmod></url>';
fwrite($fp , $siteinfo."\n");
}
}
fwrite($fp, '</urlset>');
fclose($fp);
?>
ドメインとファイルパスの指定
最初にご自身のサイトのドメインと、ファイルパスを指定しておきましょう。「https://example.com」の部分をご自分のサイトのURLに変更してください。
PHP変数「$mypath」にはファイルパスを代入しています。サーバーサイドで動くPHPでは、ファイルの読み取りにファイルのパスが必要となります。ローカルPCでは「D:\Data」などと表示される部分です。レンタルサーバーでは、サーバーごとにファイルパスが異なりますので、「dirname(__FILE__)」という関数を使って取得しています。
$myurl ="https://example.com";
$mypath = dirname(__FILE__);
$folders = array("folder1","folder2","folder3");
$fp = fopen("$mypath/sitemap.xml", "w");
fwrite($fp, '<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<url><loc>'.$myurl.'</loc><lastmod>'.date("Y-m-d").'</lastmod></url>
');
foreach($folders as $folder){
$files = glob("$mypath/$folder/*.html");
foreach($files as $filename){
$filename = basename($filename);
$filemodified = date("Y-m-d", filemtime("$mypath/$folder/$filename"));
$siteinfo = '<url><loc>'.$myurl.'/'.$folder.'/'.$filename.'</loc><lastmod>'.$filemodified.'</lastmod></url>';
fwrite($fp , $siteinfo."\n");
}
}
fwrite($fp, '</urlset>');
fclose($fp);
?>
※ここでは、PHPをルートディレクトリ(index.phpのある一番上の階層)に保存することを前提にファイルパスを取得しました。「createxmlsitemap.php」を下の階層のファイルに保存する場合には、パスの指定に工夫が必要になります。たとえば、PHPを「admin」というファイルに保存した場合には、下記のように「str_replace」を使って「admin」というファイル名をパスから削除するなど、工夫をしてみましょう。
$mypath = str_replace('/admin', '', $mypath);
sitemap.xmlを開く、書きこむ、閉じる
次に、sitemap.xmlを開き、書き込むPHPです。「fopen」で開くファイルを指定し、カッコ内の「w」で上書きを指定しました。開いたファイルは「$fp」という関数に保存されています。「fwrite」は書き込みを行うPHPの構文です。最後に「fclose」でファイルを閉じます。なお、「sitemap.xml」が存在しない場合には新たにファイルが作成されます。
ハイライトした「fwrite」で、sitemap.xmlの先頭に、「<?xml version~」を書き込んでいます。「?xml version」はこのファイルがXML形式であること、「urlset」ではXML形式のサイトマップであることを宣言しています。
さらに、先ほど「$myurl」に代入したご自身のホームページも「<url>~</url>」で囲って書き込みました。のちほど、フォルダに入っているファイルのリンクは処理しますが、ルートディレクトリ直下のファイルはここで書き込む必要があります。必要に応じて「index.html」などのページもここで書き込んでおきましょう。
$myurl ="https://example.com";
$mypath = dirname(__FILE__);
$folders = array("folder1","folder2","folder3");
$fp = fopen("$mypath/sitemap.xml", "w");
fwrite($fp, '<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<url><loc>'.$myurl.'</loc><lastmod>'.date("Y-m-d").'</lastmod></url>
');
foreach($folders as $folder){
$files = glob("$mypath/$folder/*.html");
foreach($files as $filename){
$filename = basename($filename);
$filemodified = date("Y-m-d", filemtime("$mypath/$folder/$filename"));
$siteinfo = '<url><loc>'.$myurl.'/'.$folder.'/'.$filename.'</loc><lastmod>'.$filemodified.'</lastmod></url>';
fwrite($fp , $siteinfo."\n");
}
}
fwrite($fp, '</urlset>');
fclose($fp);
?>
読み取るフォルダの指定と、フォルダ内のファイル読み取り
次に、読み取るファイルが入っているフォルダを指定しましょう。ここでは3つのフォルダ「"folder1","folder2","folder3"」を想定していますが、必要に応じて増減してください。フォルダ名は「""」が囲い、「,」で区切ります。指定するフォルダは、リンクとしてサイトマップに書き込みたいファイルが入っているフォルダのみにします。画像やCSSが入っているフォルダなどは除外しておきましょう。
指定した各フォルダの中にあるファイルを、コード中ほどの「foreach」で読み取っています。「glob」内で「*.html」と指定することにより、ここではHTMLファイルのみを読み取っています。ご自身のサイトに合わせて拡張子は適宜変更してください。
$myurl ="https://example.com";
$mypath = dirname(__FILE__);
$folders = array("folder1","folder2","folder3");
$fp = fopen("$mypath/sitemap.xml", "w");
fwrite($fp, '<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<url><loc>'.$myurl.'</loc><lastmod>'.date("Y-m-d").'</lastmod></url>
');
foreach($folders as $folder){
$files = glob("$mypath/$folder/*.html");
foreach($files as $filename){
$filename = basename($filename);
$filemodified = date("Y-m-d", filemtime("$mypath/$folder/$filename"));
$siteinfo = '<url><loc>'.$myurl.'/'.$folder.'/'.$filename.'</loc><lastmod>'.$filemodified.'</lastmod></url>';
fwrite($fp , $siteinfo."\n");
}
}
fwrite($fp, '</urlset>');
fclose($fp);
?>
フォルダ内のファイルのURLと更新日をsitemap.xmlに書き出す
最後に、sitemap.xmlにURLを書き出していく作業です。先に指定したフォルダの中のファイルを「foreach」で順番に処理していきます。先に取得したファイル名($filename)には、ファイルパス(D:\Dataなど)が含まれてしまっているので、「basename($filename)」でファイル名のみを取得するように処理しました。
「$filemodified」には、「filemtime」で取得したファイルの最終更新日時を代入しています。sitemap.xmlでは、日付は「2020-11-03」のように書き出すため、「"Y-m-d"」で日付の形式を指定しました。sitemap.xmlに書き出したいファイルの情報をいったん「$siteinfo」に代入し、「fwrite」でsitemap.xmlに書き出しています。
$myurl ="https://example.com";
$mypath = dirname(__FILE__);
$folders = array("folder1","folder2","folder3");
$fp = fopen("$mypath/sitemap.xml", "w");
fwrite($fp, '<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<url><loc>'.$myurl.'</loc><lastmod>'.date("Y-m-d").'</lastmod></url>
');
foreach($folders as $folder){
$files = glob("$mypath/$folder/*.html");
foreach($files as $filename){
$filename = basename($filename);
$filemodified = date("Y-m-d", filemtime("$mypath/$folder/$filename"));
$siteinfo = '<url><loc>'.$myurl.'/'.$folder.'/'.$filename.'</loc><lastmod>'.$filemodified.'</lastmod></url>';
fwrite($fp , $siteinfo."\n");
}
}
fwrite($fp, '</urlset>');
fclose($fp);
?>
PHPを実行する方法
PHPの作成、お疲れさまでした!上記で変更したPHPを「createxmlsitemap.php」などの名前で保存し、ブラウザから開くと、「sitemap.txt」が作成されます。しかし、このままではブラウザは白い画面になってしまいますので、HTMLで少しだけ味付けしておきました。sitemap.xmlへのリンクも入れたので、作成したサイトマップを確認するにも便利です。
<head></head>
<body>
<h1>sitemap.xmlの作成</h1>
<?php
$myurl ="https://example.com";
$mypath = dirname(__FILE__);
$folders = array("folder1","folder2","folder3");
$fp = fopen("$mypath/sitemap.xml", "w");
fwrite($fp, '<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<url><loc>'.$myurl.'</loc><lastmod>'.date("Y-m-d").'</lastmod></url>
');
foreach($folders as $folder){
$files = glob("$mypath/$folder/*.html");
foreach($files as $filename){
$filename = basename($filename);
$filemodified = date("Y-m-d", filemtime("$mypath/$folder/$filename"));
$siteinfo = '<url><loc>'.$myurl.'/'.$folder.'/'.$filename.'</loc><lastmod>'.$filemodified.'</lastmod></url>';
fwrite($fp , $siteinfo."\n");
}
}
fwrite($fp, '</urlset>');
fclose($fp);
?>
<p><a href="/sitemap.xml" target="_blank">sitemap.xml</a>の作成が完了しました。</p>
</body></html>
ブラウザではこのように表示されます。スタイルシートなどを適用しておしゃれにしてもいいですね。
最後に
Google Serch ConsoleやBing Web Masterに提出できる最も基本的なサイトマップ「sitemap.xml」を、PHPで作成する方法をご紹介しました。サイトの変更などをした場合にも、PHPを変更するだけでサイトマップを作り直すことができるので、とても便利です。PHPを初めて利用する人には少し難しく感じるかもしれませんが、ひとつひとつ作業をしていけば意外と簡単にできますのでぜひ挑戦してみてください。
この記事がサイトを自作している同志の皆様のお役に立てば幸いです。
