PHPでサイトマップを作る方法

WordPressやレンタルブログなどでウェブサイトを運用している人は、用意されているプラグインなどで、お手軽にサイトマップを作成できることと思います。しかし、独自にウェブサイトを構築している人は、独自に作成しなければいけません。今回は、PHPでサイトマップを作成する方法を解説します。

サイトマップの例

今回は、1ページ最大50,000件まで収録する子ファイルと、子ファイルをまとめたターミナルとなる親ファイル、2種類のサイトマップを作成します。Googleなどの検索エンジンには、後者の親ファイルの方のみを送信すれば大丈夫です。

次のファイル構成で作成されます。sitemap-0.xmlが50,000件の収録を超えたら、次のsitemap-1.xmlのファイルが自動的に作成され、これらをまとめた親ファイルが、sitemap-index.xml)です。なお、子ファイルが1つだけの場合は、sitemap.xmlとなり、連番はふられません。

サイトマップの構成

  • sitemap
    • sitemap-index.xml
    • sitemap-0.xml
    • sitemap-1.xml

sitemap-index.xml

ターミナルとなるファイルのサンプルです。

XML

<?xml version="1.0" encoding="UTF-8"?>
<sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
	<sitemap>
		<loc>https://syncer.jp/meta/stmp/stmp.xml</loc>
		<lastmod>2014-11-20</lastmod>
	</sitemap>
</sitemapindex>

sitemap-0.xml

各ページとなるファイルのサンプルです。

XML

<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
	<url>
		<loc>https://syncer.jp/</loc>
		<priority>1.0</priority>
		<changefreq>daily</changefreq>
		<lastmod>2014-11-20</lastmod>
	</url>
	<url>
		<loc>https://syncer.jp/ramen/</loc>
		<priority>0.4</priority>
		<changefreq>weekly</changefreq>
	</url>
	<url>
		<loc>https://syncer.jp/application/instagram/</loc>
		<priority>0.4</priority>
		<changefreq>weekly</changefreq>
		<lastmod>2014-09-09</lastmod>
	</url>
	<url>
		<loc>https://syncer.jp/web/api/twitter/</loc>
		<priority>0.4</priority>
		<changefreq>weekly</changefreq>
		<lastmod>2014-09-14</lastmod>
	</url>
	<url>
		<loc>https://syncer.jp/ramen/out-of-adachi-ku/</loc>
		<priority>0.4</priority>
		<changefreq>weekly</changefreq>
		<lastmod>2014-10-20</lastmod>
	</url>
	<url>
		<loc>https://syncer.jp/application/</loc>
		<priority>0.4</priority>
		<changefreq>weekly</changefreq>
		<lastmod>2014-07-12</lastmod>
	</url>
	<url>
		<loc>https://syncer.jp/how-to-make-mouse-tracking-by-javascript</loc>
		<priority>0.6</priority>
		<changefreq>monthly</changefreq>
		<lastmod>2014-11-18</lastmod>
	</url>
	<url>
		<loc>https://syncer.jp/twitter-how-to-delete-account</loc>
		<priority>0.6</priority>
		<changefreq>monthly</changefreq>
		<lastmod>2014-11-18</lastmod>
	</url>
	<url>
		<loc>https://syncer.jp/takenotsuka-way-of-sculpture</loc>
		<priority>0.6</priority>
		<changefreq>monthly</changefreq>
		<lastmod>2014-11-17</lastmod>
	</url>
</urlset>

ライブラリの入手

サイトマップの仕様に従って、独自にプログラムを組むのもいいですが、既に優秀なプログラムが数多く、用意されています。それらを利用するのが、一番スムーズでしょう。今回は、Osman Üngür氏が作成したライブラリ、sitemap-phpを利用してみます。GitHubのページから、ライブラリをダウンロードして下さい。

ダウンロードしたファイル(sitemap-php-master.zip)を解凍すると、中にSitemap.phpというファイルが入っています。これを利用します。

sitemap-php-master.zip

  • sitemap-php-master
    • Sitemap.php

プログラミング

早速作成していきましょう。まずはライブラリを読み込んで、インスタンスを作成して下さい。引数には、自身のウェブサイトのURLアドレスを指定します。

PHP

<?php
	// ライブラリの読み込み
	require "./Sitemap.php" ;

	// インスタンスの作成
	$stmp = new Sitemap( "https://syncer.jp" ) ;

続いてサイトマップのファイルを設置するフォルダを絶対パスで指定しましょう。/まで指定します。この指定を行なわない場合、実行ファイルと同じフォルダ内のxmlsフォルダを指定したことになります。フォルダには、パーミッションで777を指定するなどして、書き込みを許可しておいて下さい。

PHP

<?php
// 設置フォルダの指定
$stmp->setPath( "/var/www/syncer.jp/stmp/" ) ;

次に、各サイトマップファイルの名称を設定します。省略すると、sitemapを指定したことになります。例えば、下記のように設定すると、サイトマップがstmp-0.xmlstmp-1.xmlというように作られていきます。

PHP

// ファイル名の指定
$stmp->setFilename( "stmp" ) ;

準備は完了です。いよいよ、各ページを記録していきます。トップページ、カテゴリページ、コンテンツページなど、自身のウェブサイトの構成に合わせて、下記のように登録していって下さい。

パスは、インスタンスを作成する時の引数(https://syncer.jp)に続くものを指定します。/を指定すれば、https://syncer.jp/ということになります。更新日時は、YYYY-MM-DDという形式の指定で大丈夫です。下記サンプルでは、トップページを登録しています。登録するページの分だけ、各処理を繰り返して下さい。

PHP

//ページの登録
// 引数1: パス
// 引数2: 重要度
// 引数3: 更新頻度
// 引数4: 更新日時
$stmp->addItem( "/" , "1.0" , "daily" , "2015-01-20" ) ;

// [https://syncer.jp/example/hoge.html]を登録する場合
//$stmp->addItem( "/example/hoge.html" , "1.0" , "daily" , "2015-01-20" ) ;

最後に、親ファイルを作成して完了です。第1引数には、親ファイルの設置場所となるフォルダを、最後の/まで指定して下さい。第2引数には、最終更新日を指定します。通常、Todayを変更しないで大丈夫です。余談ですが、このライブラリの最終更新日時に指定した値は、strtotime()の関数にかけられて処理されます。

PHP

// ターミナルファイルの作成
$stmp->createSitemapIndex( "http://example.com/sitemap/" , "Today" ) ;

サンプルコード

この記事で紹介したチュートリアルを反映したサンプルコードを紹介しています。よろしければ、カスタムしてお使い下さい。

PHP

<?php
	// ライブラリの読み込み
	require "./Sitemap.php" ;

	// ファイル名の指定
	$filename = 'stmp' ;

	// インスタンスの作成
	$stmp = new Sitemap( "http://example.com" ) ;

	// 設置フォルダの指定
	$stmp->setPath( "/var/www/example.com/public_html/" ) ;

	// ファイル名の指定
	$stmp->setFilename( $filename ) ;

	// ページの登録
	// 引数1: パス
	// 引数2: 重要度
	// 引数3: 更新頻度
	// 引数4: 更新日時
	$stmp->addItem( "/" , "1.0" , "daily" , "2014-11-20" ) ;
	$stmp->addItem( "/1.html" , "1.0" , "daily" , "2014-11-21" ) ;
	$stmp->addItem( "/2.html" , "1.0" , "daily" , "2014-11-22" ) ;
	$stmp->addItem( "/3.html" , "1.0" , "daily" , "2014-11-23" ) ;
	$stmp->addItem( "/4.html" , "1.0" , "daily" , "2014-11-24" ) ;
	$stmp->addItem( "/5.html" , "1.0" , "daily" , "2014-11-25" ) ;

	// [https://syncer.jp/example/hoge.html]を登録する場合
	// $stmp->addItem( "/example/hoge.html" , "1.0" , "daily" , "2014-11-20" ) ;

	// ターミナルファイルの作成
	$stmp->createSitemapIndex( "http://example.com/" , "Today" ) ;

	// HTML
	$html = '' ;

	// 内容を表示する
	$html .= '<h2>作成したサイトマップ</h2>' ;

	// cURLのオプションだけ用意
	$curl = curl_init() ;
	curl_setopt( $curl, CURLOPT_HEADER, false ) ;					// ヘッダーを取得しない
	curl_setopt( $curl, CURLOPT_SSL_VERIFYPEER, false ) ;			// 証明書の検証を行わない
	curl_setopt( $curl, CURLOPT_RETURNTRANSFER, true ) ;			// curl_execの結果を文字列で返す
	curl_setopt( $curl, CURLOPT_TIMEOUT, 15 ) ;						// タイムアウトの秒数
	curl_setopt( $curl, CURLOPT_FOLLOWLOCATION , true ) ;			// リダイレクト先を追跡するか?
	curl_setopt( $curl, CURLOPT_MAXREDIRS, 5 ) ;					// 追跡する回数

	// 作成したサイトマップの内容を取得する
	foreach( array( $filename . '-index', $filename ) as $name ) {
		// ファイル名の整理
		$file_xml = $name . '.xml' ;
		$request_url = "http://example.com/" . $file_xml ;

		// cURLを利用してリクエスト
		curl_setopt( $curl, CURLOPT_URL , $request_url ) ;
		$xml = curl_exec( $curl ) ;

		// 表示
		$html .= '<h3>' . $file_xml . '</h3>' ;
		$html .= '<textarea>' . $xml . '</textarea>' ;
	}

	// cURLを終了
	curl_close( $curl ) ;

	// ブラウザに[$html]の内容を出力
	// 運用時はHTMLのヘッダーとフッターを付けましょう。
	echo $html ;

デモを見る (VIEW DEMO)

デモを見る (VIEW DEMO)

ダウンロード

紹介したサンプルコードを、こちらからダウンロードできます。

ファイル一覧

SYNCER000181
make-sitemap.php Download
Sitemap.php
readme.txt Download

ファイル名をクリックすると内容を確認できます。「Download Zip」をクリックするとファイル一式をダウンロードできます。

ご利用の際は、付属のREADMEファイル(readme.txt)をご確認下さい。

Sitemap.phpはzipファイルの中に含まれていません。

Download Zip