独自URLに対応する「サイトマップインデックスファイル」の生成
WordPressが管理しない独自のURLで提供するコンテンツを
サイト内に構成した場合、サイトマップも独自で準備する必要があります。
ここではPHPを利用して「サイトマップインデックスファイル」の
出力プログラムをご紹介します。
サイトマップのURLが5万件以下であれば単一サイトマップで十分ですが、
5万件を超える場合は、別途サイトマップインデックスを準備し、
各サイトマップヘのURLをリスト化する必要があります。
尚、この記事で作成するサイトマップインデックスは、
以下のサイトマップ作成に対してのものになります。
また対象プログラムは以下になります。
概要
「サイトマップインデックスファイル」の成果物
サイトマップとサイトマップインデックスファイルは、
XML形式のデータとして作成します。
仕様はGoogleでも紹介されています。(後述)
今回作成するサイトマップインデックスは、
99個のサイトマップファイルへのURLを示したインデックスとして作成します。
こんな感じのものを生成します。
リストの各URLが、サイトマップファイルへのURLになっています。
sitmap_100.xml (→ファイルには100/1/1~199/12/31までのURLが記載されているリスト)
sitmap_200.xml (→ファイルには200/1/1~299/12/31までのURLが記載されているリスト)
sitmap_300.xml (以下同)
sitmap_400.xml
sitmap_500.xml
sitmap_600.xml
sitmap_700.xml
sitmap_800.xml
sitmap_900.xml
sitmap_1000.xml
・
・
・
sitmap_9900.xml
と。
独自URLに対応するサイトマップインデックス出力プログラム
基本的にはサイトマップインデックス仕様に従って、PHPで出力するプログラムを生成します。
以下の様なプログラムを「sm_demo/sitemap_idx.php」に配置しています。
まぁ、直接叩いてもサイトマップインデックスは表示されます(パラメータ不要の為)
このままではURLがインデックス要求向きではありませんけども。
https://rensrv.com/sm_demo/sitemap_idx.php
実際には以下の様な処理を記述しています。
※namespaceなど適宜ご指定をお願いします。
sitemap_idx.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 |
<?php $obj = new sitemapidx_gen; $xml = $obj->proc_sm(); if(!$xml == false){ header('Content-Type: text/xml'); //ヘッダーの出力が必要 echo $xml->asXML(); }else{ echo 'XML生成に失敗しました'; } class sitemapidx_gen{ private $dom = ''; //**コンストラクタ function __construct(){ if (empty($_SERVER["HTTPS"])) { $prot = "http://"; } else { $prot = "https://"; } if (empty($_SERVER["HTTP_HOST"])) { //直接実行 $this->dom = 'http://XXXXXX.XXXX.local/'; }else{ $this->dom = $prot. $_SERVER["HTTP_HOST"] . '/'; } } //**デストラクタ function __destruct(){ } //サイトマップ生成処理 function proc_sm(){ $xmlstr =<<<xm <?xml version="1.0" encoding="UTF-8"?> <?xml-stylesheet type="text/xsl" href="/sm_demo/sitemapindex_template.xsl" ?> <sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"></sitemapindex> xm; //XML生成 $xml = new \SimpleXMLElement($xmlstr); $y = 100; //100年単位で日付ごとにURLを作成する for($i = $y; $i < 9999; $i=$i+100){ $cur_y = (string)$i; //URL生成 $url = $this->dom ."sm_demo/sitmap_{$cur_y}.xml"; //XMLに追加 $xmlitem = $xml -> addChild("sitemap"); $xmlitem -> addChild('loc', $url); $xmlitem -> addChild('lastmod', '2018-05-30'); } 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/sitemapindex_template.xsl" ?> <sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"></sitemapindex> xm;
の部分で、
空のXMLを定義しています。
この時点で「href="/sm_demo/sitemapindex_template.xsl
」として、
「https://rensrv.com/sm_demo/sitemapindex_template.xsl」ファイルで、
XMLスタイル(xsl)指定を行っています。
SimpleXMLElementインスタンスの生成
空の文字列として準備した「$xmlstr
」を
「$xml = new \SimpleXMLElement($xmlstr);
」として、
「SimpleXMLElement
」インスタンスを生成します。
以後は「$xml
」に対して要素の追加を行っていきます。
この時点で「<sitemapindex></sitemapindex>
」がXMLのルートタグになっています。
<sitemap></sitemap>ノードの追加
サイトマップインデックスには、1URL(サイトマップへのURL)を、
「<sitemap></sitemap>ノード」として追加していきます。
ループ処理の中で、以下のように子要素を都度追加しています。
$xmlitem = $xml -> addChild("sitemap");
<loc></loc><lastmod></lastmod>子要素を追加しURLを指定
作成した「<sitemap></sitemap>ノード」($xmlitem
インスタンス)の子として、
<loc></loc>と、<lastmod></lastmod>の子ノードを追加します。
その際に「loc」には、サイトマップのURLを指定します。
「lastmod」には最終更新日を指定します。(ここでは固定日付)
$xmlitem -> addChild('loc', $url);
$xmlitem -> addChild('lastmod', '2018-05-30');
日付を定期的に更新する必要がある場合は別途仕組みを考えてください。
(対象固定ページの最終更新日を自動的に取得する・・・など?)
使用可能なタグは以下を参照下さい。
サイトマップ インデックスの XML タグ定義
属性 説明 <sitemapindex>
必須 ファイル内のすべてのサイトマップに関する情報を囲みます。 <sitemap>
必須 個々のサイトマップの情報を囲みます。 <loc>
必須 サイトマップの場所を指定します。 この場所には、サイトマップ、Atom ファイル、RSS ファイル、テキスト ファイルを配置できます。
<lastmod>
オプション 対応するサイトマップ ファイルの更新時刻を指定します。 サイトマップにリストされているページの変更時刻ではありません。 lastmod タグの値は、W3C Datetime 形式で指定する必要があります。 最終更新日のタイムスタンプを提供すると、検索エンジンのクローラがインデックス内の特定のサイトマップのみをクロールできるようになります。たとえば、特定の日付以降に更新されたサイトマップのみがクロールされます。このようにサイトマップを段階的にクロールすることで、大規模なサイトでも新しい URL を迅速に見つけることができます。
メソッドから「$xml」インスタンスの返却とブラウザ出力
メソッドの最後で「return $xml;
」として「$xml」インスタンスを返しています。
受け取ったXMLの生成に成功していた場合(falseでない)には、
表示用のヘッダーの出力後「$xml->asXML();
」でXMLの出力を行います。
1 2 3 4 5 6 7 |
$xml = $obj->proc_sm(); if(!$xml == false){ header('Content-Type: text/xml'); //ヘッダーの出力が必要 echo $xml->asXML(); }else{ echo 'XML生成に失敗しました'; } |
サイトマップインデックスへのURLリライト定義
この状態でも前述の通り、
直接URL指定すれば、サイトマップインデックスは表示されます。
https://rensrv.com/sm_demo/sitemap_idx.php
しかし、やはりURLも「~.xml」としたいものです。
.htaccessによるリライト定義
特定のURLに対してアクセスがあった場合、
この「sm_demo/sitemap_idx.php」が応答するようにリライトを定義します。
1 |
RewriteRule ^sm_demo/sitmap_index.xml$ /sm_demo/sitemap_idx.php [L] |
これによって「sm_demo/sitmap_index.xml
」への要求は、
「sm_demo/sitemap_idx.php
」への要求として処理されます。
では実際にアクセスをします。
サイトマップが正常に表示されていれば問題ありませんが、
作成した当初はおそらくは平文で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 サイトマップ インデックスのサンプル
次の例では、2 つのサイトマップをリストするサイトマップ インデックスを作成します。
123456789101112131415161718192021 <?xml version="1.0" encoding="UTF-8"?><sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"><sitemap><loc>http://www.example.com/sitemap1.xml.gz</loc><lastmod>2004-10-01T18:23:17+00:00</lastmod></sitemap><sitemap><loc>http://www.example.com/sitemap2.xml.gz</loc><lastmod>2005-01-01</lastmod></sitemap></sitemapindex>(抜粋引用)sitemaps.org – プロトコル
当サイト内のコンテンツおよび画像を含むすべてにおいて、管理人アルゴリズンが著作権を保持しております。
当サイトでご紹介しております写真等につきましては著作権の放棄はしませんが、
ライセンスフリーでご利用いただいて構いません。
コンテンツを有益であると感じていただけましたら非常に光栄です。
ありがとうございます。
サイト内コンテンツを引用される際には、出典元として当サイト(個別記事)へのリンクをお願いいたします。
申し訳ございませんが、無断転載、複製をお断りさせて頂いております。
公開日: