良いコンテンツのサイトこそ安定した収入を生み出す

サイトマップの作成 自作PHPプログラムを無料公開

自分でWEBサイトを立ち上げている方なら、誰しもgoogleなどの検索エンジン用にサイトマップを用意されていると思います。典型的には sitemap.xml などというファイルを作って、サイトにアップロード、Google Search Console などで登録して「検索エンジンに登録してね」とサイトにどんなページがあるか伝えるファイルです。

私ももちろん使っていますし、無料で sitemap を作ってくれるサービスに頼っていました。例えばここにはお世話になりました。自分のサイトのURLを入れれば、無料で sitemap.xml を作ってダウンロードさせてくれますから太っ腹なサービスで愛用させていただきました。

でも、私が管理するサイトもどんどん情報量が増え、700ページ、800ページというサイトができてきたら不都合が生じました。愛用していた無料でサイトマップを作ってくれるサービスは最高500ページまで。他の似たサービスを探してみましたが、そちらは200ページまで。これでは私のサイトのサイトマップは作れません。

確かにサイトの解析にはとても時間がかかる(その間CPUに負荷がかかる)わけですから、そんな巨大サイトまで無償で対象にしていたのではやっていけないでしょう。それはわかりますが、さて困った。サイトマップなんてたまにしか作りませんから、そのために有料のサービスを使う気は起きないですし。ダウンロードして使うサイトマップ作成ツールも試してみましたが、Windows 11 に対応した新しいものはほとんどなく、PHPをダウンロードして走らせるタイプも、解析に時間がかかりすぎてタイムアウトのエラーが出てしまいました。

要は「他人に頼っていてはサイトマップはできない」とわかったわけで、しかたなく?!自分でPHPでサイトマップを作成するコードを書いて使うことにしました。

サイトマップ作成プログラムのコード

以下がそのコードです。利用は無料、改変は自由です。

<?php と ?> に挟まれた部分空のテキストファイルにをコピーし、sitemapmake.php とかの名前を付けて、ご利用のサイトの一番上のディレクトリにアップロードして走らせてください。なお、このサイトマップ作成ソフトの使用に際してはあくまで自己責任でお願い致します。他人が信用出来ない方は使わないほうが良いでしょう。PHPがわかる方なら、別に悪さはしていないことがすぐわかると思いますが。使用上の注意は下の方に書いてあります

<?php
/*
sitemap maker ver. 1.3
2022/6/16
©Hitonomori Co. Ltd.
*/
ini_set('display_errors', "On"); //エラーを表示させてサイト内のリンクエラーを確認
$httphost = (empty($_SERVER['HTTPS']) ? 'http://' : 'https://') . $_SERVER['HTTP_HOST'];
$sitemapurls["/"]=date( "Y-m-d", @filemtime("./"));
$allpages[0]="/";
$counter=1;
$maincounter=0;
while(@$allpages[$maincounter])
{
$html_source = file_get_contents($httphost.$allpages[$maincounter]);
//echo "分析中".$httphost.$allpages[$maincounter]; //分析中のページを表示
$dir = pathinfo($allpages[$maincounter].'bug');
$lines2 = explode("<a ", $html_source);
foreach($lines2 as $param)
{
if (strpos($param, "href")!==false) {
$lines = explode("</a>",$param);
$matchcount=preg_match("|<a href=\"(.*?)\".*?>(.*?)</a>|mis","<a ".$lines[0]."</a>",$matches);
if($matchcount > 0) {
if(((strpos($matches[1], "http") ===false) or (strpos($matches[1], $httphost)!==false)) and (strpos($matches[1], "../")===false) and ($matches[1] != "/") and (strpos($matches[1], "tel:")===false) and (strpos($matches[1], "mailto:")===false) and (strpos($matches[1], "wp-login")===false)) //除外するファイルやディレクトリはここに記載
{
$lines4=explode("#",$matches[1]);
if(strpos($lines4[0], $httphost) !== false) {
$lines4[0] = str_replace($httphost,"",$lines4[0]);
} else {
$lines4[0]=$dir['dirname']."/".$lines4[0];
}
$lines5=str_replace("//","/",$lines4[0]);
if(!isset($sitemapurls[$lines5])){
if(@filemtime(".".$lines5)) {
$sitemapurls[$lines5]=date( "Y-m-d", filemtime(".".$lines5));
} else {
$sitemapurls[$lines5]=0;
}
$allpages[$counter]=$lines5;
echo $counter." : ".'<a href="'.$lines5.'">'.$matches[2]."</a><br>\n";
$counter++;
}
}
}
}
}
$maincounter++;
//if($counter >1000) {//ページ数が多すぎてタイムアウトになることを防止。必要に応じて適宜変更して使用
//echo "over";
//exit;
//}
}
//xmlの書き込み 最初はここから最後までをコメントアウトして、サイトのリンク構造のエラーチェックをすることをお勧め
// インスタンスの生成
$dom = new DomDocument('1.0', 'UTF-8');
// urlset ノードを追加
$urlset = $dom->appendChild($dom->createElement('urlset'));
$urlset->setAttribute('xmlns', 'http://www.sitemaps.org/schemas/sitemap/0.9');
foreach($sitemapurls as $pageurl => $date) {//階層による優先度の設定
switch(substr_count($pageurl, '/'))
{
case 1:
$priority = "1.0";
break;
case 2:
$priority = "0.9";
break;
case 3:
$priority = "0.8";
break;
default:
$priority = "0.5";
}
$url = $urlset->appendChild($dom->createElement('url'));
// 要素ノードを追加
$url->appendChild($dom->createElement('loc', $httphost.$pageurl));
if($date != 0) {
$url->appendChild($dom->createElement('lastmod', $date));//最終更新日を入れる
}
$url->appendChild($dom->createElement('changefreq', 'Weekly'));//更新頻度を入れる
$url->appendChild($dom->createElement('priority', $priority));//優先度を入れる
}
$dom->formatOutput = true;
//保存
$dom->save('sitemap.xml');//sitemap のファイルを指定 既存のファイルは上書き
echo "done";

?>

サイトマップ作成プログラム使用上の注意

基本的に自分のニーズに合わせて作りましたので、機能が限られている部分があります。

安い共用のサーバーなどで大きなサイトを分析しようとすると、負荷が高くなりすぎて時間切れのエラーや、以下のようなエラーが発生することがあります。特にWordPressなどで動的なサイトを運用している場合には気を付けてください。

502 Bad Gateway

このプログラムの処理自体は軽いものですが、WordPress(あるいは他の動的なサイト)で作られた各ページを連続して読み込むために、WordPressの側の処理で一度にサーバーに負荷がかかります。基本、WordPressのサイトマップは、専用のプラグイン等に任せるほうが良いです。

サイトマップを作成するサイトのURLですが、自動的にアップロードされたサイトのトップを認識するようにしてあります。解析してできたサイトマップのファイルは、アップロードしたのと同じディレクトリに作られます。古いものは上書きされてしまいますから、前のものを保管しておきたいときなどは、リネームするか、上のプログラムの最後の方にある('sitemap.xml')の部分のファイル名を変更してください。

このプログラムはディレクトリが上にあるものから下へとリンクを辿って進んでいきます。どこからもリンクが無いページや、下位のディレクトリからしかリンクのないページ(../を付けてしか辿れないもの)は記録されません。ただし、https://sample.com/otameshi.html のようにドメイン名から書かれたリンクはたどることができます。

たどることができるリンクは、HTMLで <a href="honyarara.html"></a>のように<a タグで作られたものだけです。クオテーションは""(ダブル)を判別しますが、''(シングル)で挟まれた <a href='honyarara.html'></a>は認識しません。

idがついたリンク honyarara.html#koko のようなものは、#以下を削除して登録します。逆に?や&を使った因数は削除しません。honyarara.html?name=boku の場合、このまま登録されます。

<a タグでリンクが作られていたら、画像ファイルも登録してしまいます。jpgなどを除外する場合には、「除外するファイルやディレクトリはここに記載」とある部分に条件を追加してください。

WordPressなどのCMSを使用されている場合は、リンクをたどりきれなかったり、逆に管理ページへのリンクを拾ってしまったりする可能性があります。除外したいページは「除外するファイルやディレクトリはここに記載」とある部分に条件を追加してください。とりあえずWordPressのwp-admin ページへのリンクは拾わないようにしてあります。

デフォルトではPHPのエラーが表示されるようにしてあります。例えばサイトのリンク構造にエラーがある場合、例えばリンク先は削除されていて存在しないような場合、プログラムが走っている時にエラーが表示されます。エラーの内容を参考にして、サイトのリンクを修正してください。エラーは出ますが、存在しないリンク先も登録されてしまいます。

Sponsored Link