独自URLに対応する「サイトマップファイル」の生成
WordPressが管理しない独自のURLで提供するコンテンツを
サイト内に構成した場合、サイトマップも独自で準備する必要があります。
ここではPHPを利用して「サイトマップファイル」の出力プログラムをご紹介します。
サイトマップのURLが5万件以下であれば単一サイトマップで十分ですが、
5万件を超える場合は、別途サイトマップインデックスを準備し、
各サイトマップヘのURLをリスト化する必要があります。
ここでは対象プログラムは以下を想定しています。
記事で作成するサイトマップは1ファイル当り 36500前後のURLを設定し、
99ファイルに分割しています。
よって、検索エンジンにはサイトマップインデックスを介して登録し、
インデックス登録要求を行います。
「サイトマップファイル」の成果物
サイトマップとサイトマップインデックスファイルは、
XML形式のデータとして作成します。
仕様はGoogleでも紹介されています。(後述)
今回作成するサイトマップファイルは、
99個のサイトマップファイルを生成し、
1つのサイトマップインデックスでリスト化する形式を想定します。
1つのサイトマップファイルはこんな感じのものを生成します。
※環境によりますが、表示まで5秒前後はかかります。
リストの各URLが独自URLを示し、
それぞれを検索エンジンに対して、インデックス要求をするという想定です。
実際に1つのURLにアクセスすると、
URLで指定された「YYYY/MM/DD/」に指定された日付を元にして、
ページ内に「曜日」が表示されるプログラムです。
「https://rensrv.com/weekday/2018/05/30/」にアクセスすると、
「2018/05/30」の「曜日」が計算されて表示されます。
プログラム詳細
独自URLに対応するサイトマップ出力プログラム
基本的にはサイトマップ仕様に従って、PHPで出力するプログラムを生成します。
以下の様なプログラムを「sm_demo/sitemap.php」に配置しています。
直接アクセスした場合、1900年が指定されたものとして処理されます。
※環境によりますが、表示まで5秒前後はかかります。
実際には以下の様な処理を記述しています。
※namespaceなど適宜ご指定をお願いします。
sitemap.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 |
<?php $obj = new sitemap_gen; global $wp_query; if( isset($_SERVER['QUERY_STRING'])){ parse_str($_SERVER['QUERY_STRING'], $var); if( isset($var['sitemap_year'])){ $year =$var['sitemap_year']; $xml = $obj->proc_sm($year); }else{ $xml = $obj->proc_sm(); } }else{ //手動実行 $y = '1900'; $xml = $obj->proc_sm($y); } if(!$xml == false){ header('Content-Type: text/xml'); //ヘッダーの出力が必要 echo $xml->asXML(); }else{ echo 'XML生成に失敗しました'; } class sitemap_gen{ private $dom = ''; //**コンストラクタ function __construct(){ if (empty($_SERVER["HTTPS"])) { $prot = "http://"; } else { $prot = "https://"; } if (empty($_SERVER["HTTP_HOST"])) { //直接実行 $this->dom = 'http://rensrv-com.pisolith.local/'; }else{ $this->dom = $prot. $_SERVER["HTTP_HOST"] . '/'; } } //**デストラクタ function __destruct(){ } //サイトマップ生成処理 function proc_sm($year = '1900'){ $xmlstr =<<<xm <?xml version="1.0" encoding="UTF-8"?> <?xml-stylesheet type="text/xsl" href="/sm_demo/sitemap_template.xsl" ?> <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"></urlset> xm; //XML生成 $xml = new \SimpleXMLElement($xmlstr); $y = (int)$year; //開始日 $sd = new DateTime("$year-1-1"); //終了日 $ey = (string)($y+100); $ed = new DateTime("$ey-1-1"); $interval = $sd->diff($ed); //差分日数 $interval_days = $interval->format("%a"); $oneday = new DateInterval('P1D'); //1日分 //100年単位で日付ごとにURLを作成する for($i = 0; $i < $interval_days; $i++){ $cur_y = $sd->format('Y');$cur_m = $sd->format('m');$cur_d = $sd->format('d'); //URL生成 $url = $this->dom . "weekday/{$cur_y}/{$cur_m}/{$cur_d}/"; //XMLに追加 $xmlitem = $xml -> addChild("url"); $xmlitem -> addChild('loc', $url); $xmlitem -> addChild('lastmod', '2018-05-30'); $xmlitem -> addChild('changefreq', 'monthly'); $xmlitem -> addChild('priority', '0.5'); $sd->add($oneday); } return $xml; } } |
「$xml = new \SimpleXMLElement($xmlstr);
」にある通り、
「SimpleXMLElement
」クラスを利用しています。
コンストラクタ部分は環境依存(本番、ローカル)の
切替のドメイン振り分けのみですので無視して構いません。
「sitemapidx_gen->proc_sm()
」メソッドが処理の実体です。
空のXML文書を文字列で生成
$xmlstr =<<<xm <?xml version="1.0" encoding="UTF-8"?> <?xml-stylesheet type="text/xsl" href="/sm_demo/sitemap_template.xsl" ?> <sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"></sitemapindex> xm;
の部分で、
空のXMLを定義しています。
この時点で「href="/sm_demo/sitemap_template.xsl
」として、
「https://rensrv.com/sm_demo/sitemap_template.xsl」ファイルで、
XMLスタイル(xsl)指定を行っています。
SimpleXMLElementインスタンスの生成
空の文字列として準備した「$xmlstr
」を
「$xml = new \SimpleXMLElement($xmlstr);
」として、
「SimpleXMLElement
」インスタンスを生成します。
以後は「$xml
」に対して要素の追加を行っていきます。
この時点で「<urlset></urlset>
」がXMLのルートタグになっています。
<url></url>ノードの追加
サイトマップインデックスには、1URL(サイトマップへのURL)を、
「<url></url>ノード」として追加していきます。
ループ処理の中で、以下のように子要素を都度追加しています。
$xmlitem = $xml -> addChild("url");
途中、URLの生成処理部分に当たる以下の部分は、
URL文字列(sitemap_year)の値が設定されていれば、その年を使用する切り分けを行い。
1サイトマップには100年単位の全日付分のURLを生成しています。
※約36,500日分を一日ずつループして日付を求めています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
$y = (int)$year; //開始日 $sd = new DateTime("$year-1-1"); //終了日 $ey = (string)($y+100); $ed = new DateTime("$ey-1-1"); $interval = $sd->diff($ed); //差分日数 $interval_days = $interval->format("%a"); $oneday = new DateInterval('P1D'); //1日分 //100年単位で日付ごとにURLを作成する for($i = 0; $i < $interval_days; $i++){ $cur_y = $sd->format('Y');$cur_m = $sd->format('m');$cur_d = $sd->format('d'); //URL生成 $url = $this->dom . "weekday/{$cur_y}/{$cur_m}/{$cur_d}/"; |
<loc><lastmod><changefreq><priority>子要素を追加しURLを指定
作成した「<url></url>ノード」($xmlitem
インスタンス)の子として、
以下の子ノードを追加します。
<loc></loc>
(コンテンツURL)
<lastmod></lastmod>
(最終更新日)
<changefreq></changefreq>
(更新頻度)
<priority></priority>
(優先度)
その際に「loc」には、コンテンツURLを指定します。
「lastmod」には最終更新日を指定します。(ここでは固定日付)
$xmlitem -> addChild('loc', $url);
$xmlitem -> addChild('lastmod', '2018-05-30');
$xmlitem -> addChild('changefreq', 'monthly');
$xmlitem -> addChild('priority', '0.5');
日付を定期的に更新する必要がある場合は別途仕組みを考えてください。
(対象固定ページの最終更新日を自動的に取得する・・・など?)
使用可能なタグは以下を参照下さい。
XML タグ定義
使用できる XML タグは次のとおりです。
属性 説明 <urlset>
必須 ファイルの他のタグを囲み、現在のプロトコル標準を参照します。 <url>
必須 各 URL エントリの親タグです。 その他のタグは、このタグ内に含めます。 <loc>
必須 ページの URL です。 ウェブ サーバーによっては、http などのプロトコルから始め、末尾にスラッシュを含める必要があります。 この値は 2,048 文字以下で指定する必要があります。 <lastmod>
オプション ファイルの最終更新日です。 この日付は W3C Datetime 形式で記述します。 必要な場合は、時刻の部分を省略して YYYY-MM-DD の形式で記述することもできます。 このタグは、サーバーが返す If-Modified-Since (304) ヘッダーとは別のものです。検索エンジンは、両方のソースからの情報を別々に使用することがあります。
<changefreq>
オプション ページの更新頻度です。 検索エンジンではこの値を参考情報として使用しますが、指定した値とは異なる頻度でクロールされることがあります。 有効な値は次のとおりです。
- always
- hourly
- daily
- weekly
- monthly
- yearly
- never
“always” 値は、アクセスするたびに内容が更新されるドキュメントに使用します。 “never” 値は、アーカイブ ページの URL に使用します。
このタグの値は、コマンドではなくヒントとして使用されることに注意してください。検索エンジンのクローラは、この情報を使用してクロール頻度を調整しますが、実際のクロールは “hourly” と指定されたページでは 1 時間に 1 回以下、”yearly” と指定されたページでは 1 年に 1 回以上行われます。また、”never” と指定されたページも予期せず変更された場合に備えて定期的にクロールされます。
<priority>
オプション サイト内の他の URL と比較したこの URL の優先度です。0.0 から 1.0 までの値を指定できます。この値は他のサイトのページとの比較方法に影響するものではなく、検索エンジンのクローラに重要なページを知らせるためのものです。 ページのデフォルトの優先度は 0.5 です。
ページに割り当てた優先度が、検索エンジンの検索結果に表示されるページの掲載順位に影響することはほとんどありません。検索エンジンでは、この情報を使用してサイトから URL を選択するため、最も重要なページを検索インデックスに優先的に登録することができます。
また、サイト内のすべての URL に高い優先度を設定しないでください。優先度は相対的なものであるため、サイト内で URL を選択する場合にのみ使用します。
(抜粋引用)sitemaps.org – プロトコル
メソッドから「$xml」インスタンスの返却とブラウザ出力
メソッドの最後で「return $xml;
」として「$xml」インスタンスを返しています。
受け取ったXMLの生成に成功していた場合(falseでない)には、
表示用のヘッダーの出力後「$xml->asXML();
」でXMLの出力を行います。
1 2 3 4 5 6 |
if(!$xml == false){ header('Content-Type: text/xml'); //ヘッダーの出力が必要 echo $xml->asXML(); }else{ echo 'XML生成に失敗しました'; } |
サイトマップインデックスへのURLリライト定義
「https://rensrv.com/sm_demo/sitemap.php」は、
実際にはサイトマップインデックス側から定義されたURLリストに基づいて、
以下の様なURLでアクセスすることを想定しています。
「sm_demo/sitmap_YYYY.xml」の要求を、
「YYYY」部分をパラメータとして「sm_demo/sitemap.php」へと渡します。
.htaccessによるリライト定義
特定のURLに対してアクセスがあった場合、
この「sm_demo/sitemap_idx.php」が応答するようにリライトを定義します。
1 |
RewriteRule ^sm_demo/sitmap_([1-9]?[0-9]00)\.xml$ /sm_demo/sitemap.php?sitemap_year=$1 [L] |
これによって「sitmap_([1-9]?[0-9]00)\.xml
」の正規表現にマッチする要求は、
「/sm_demo/sitemap.php?sitemap_year=$1
」への要求として処理されます。
「$1
」の部分は正規表現に該当する「([1-9]?[0-9]00)
」部分の数値が渡されます。
「sitmap_2000.xml
」なら「$1
」は「2000」となり、
「/sm_demo/sitemap.php?sitemap_year=2000
」のように処理されます。
結果として、以下を実行した時と同じ動作になります。
パラメータを渡すことでも実際に実行されます。
これは「西暦2000年~2099年」の各年1/1~12/31をURLとして生成します。
では実際にアクセスをします。以下は2100年指定です。
サイトマップが正常に表示されていれば問題ありませんが、
作成した当初はおそらくは平文でXMLが表示されているかもしれません。
それはスタイルをまだ定義していない為です。
その場合は以下の様なスタイル未定義のXMLが表示される事と思います。
スタイルを設定します。
サイトマップインデックスの作成がまだの場合は以下でご紹介しています。
以下は参考情報になります。
「サイトマップファイル」の仕様
サイトマップとサイトマップインデックスファイルは、
XML形式のデータとして作成します。
仕様はGoogleでも紹介されています。
サイトマップ形式
Google では、下記のように複数のサイトマップ形式をサポートしています。
どの形式でも 1 つのサイトマップにはサイズが 50 MB(圧縮しない状態で)以下、URL が 50,000 件以下という制限があります。これよりサイズが大きい場合や、URL が多い場合は、複数のサイトマップにリストを分割する必要があります。または、サイトマップ インデックス ファイル(サイトマップのリストを参照するファイル)を作成して、そのインデックス ファイルのみ Google に送信することもできます。複数のサイトマップやサイトマップ インデックス ファイルを Google に送信できます。
XML
Google は標準のサイトマップ プロトコルをサポートしています。また、動画、画像、ニュースの各リソース用の XML 拡張機能もサポートしています。これらの拡張機能を使用して、サイト上にある動画ファイル、画像などの解析しにくいコンテンツについて記述し、こうしたリソースの Google インデックスへの登録方法を改善することができます。
123456 <?xml version="1.0" encoding="UTF-8"?><urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"><url><loc>http://www.example.com/foo.html</loc></url></urlset>
基本的には「標準のサイトマップ プロトコル」に従ってXMLを生成します。
サイトマップを利用する場合、
「サイトマップのサンプル」の部分を参照します。
XML サイトマップのサンプル
次に、XML 形式のサイトマップの例を示します。 このサイトマップには複数の URL が含まれており、各 URL には異なるオプション パラメータが使用されています。
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253 <?xml version="1.0" encoding="UTF-8"?><urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"><url><loc>http://www.example.com/</loc><lastmod>2005-01-01</lastmod><changefreq>monthly</changefreq><priority>0.8</priority></url><url><loc>http://www.example.com/catalog?item=12&desc=vacation_hawaii</loc><changefreq>weekly</changefreq></url><url><loc>http://www.example.com/catalog?item=73&desc=vacation_new_zealand</loc><lastmod>2004-12-23</lastmod><changefreq>weekly</changefreq></url><url><loc>http://www.example.com/catalog?item=74&desc=vacation_newfoundland</loc><lastmod>2004-12-23T18:00:15+00:00</lastmod><priority>0.3</priority></url><url><loc>http://www.example.com/catalog?item=83&desc=vacation_usa</loc><lastmod>2004-11-23</lastmod></url></urlset>サイトマップ インデックス ファイル (複数のサイトマップ ファイルのインデックス) を使用する場合
複数のサイトマップ ファイルを送信できますが、各サイトマップ ファイルにリストする URL は 50,000 個まで、ファイル サイズは 50 MB (52,428,800 バイト) 以下とする必要があります。必要な場合は、サイトマップ ファイルを gzip 形式で 50 MB 以下に圧縮して、サーバーの負荷を軽減できます。50,000 個以上の URL をリストする場合は、複数のサイトマップ ファイルを作成する必要があります。
複数のサイトマップを使用する場合は、サイトマップ インデックス ファイルに各サイトマップ ファイルをリストする必要があります。 サイトマップ インデックス ファイルには、最大で 50,000 個のサイトマップをリストできます。サイズは 50 MB (52,428,800 バイト) 以下に圧縮する必要があります。 また、サイトマップ インデックス ファイルが含まれている必要があります。サイトマップ インデックス ファイルの XML 形式は、サイトマップ ファイルとほぼ同じです。
(抜粋引用)sitemaps.org – プロトコル
当サイト内のコンテンツおよび画像を含むすべてにおいて、管理人アルゴリズンが著作権を保持しております。
当サイトでご紹介しております写真等につきましては著作権の放棄はしませんが、
ライセンスフリーでご利用いただいて構いません。
コンテンツを有益であると感じていただけましたら非常に光栄です。
ありがとうございます。
サイト内コンテンツを引用される際には、出典元として当サイト(個別記事)へのリンクをお願いいたします。
申し訳ございませんが、無断転載、複製をお断りさせて頂いております。
公開日:
最終更新日:2018/06/02