AD5 WordPress Lab

WordPressにXMLサイトマップを独自実装するカスタマイズ

WordPressにXMLサイトマップを独自実装するカスタマイズ

WordPressに限らず、SEO対策に不可欠なXMLサイトマップ。

カスタマイズせずとも「Google XML Sitemaps」などのプラグインで瞬殺なわけですが、

多くのXMLサイトマッププラグインは、柔軟に設定できるように作られている分、

「このサイトでは要らない機能」がたくさん含まれることになるので、多少なりともリソースの無駄遣いになります。

独自実装する方法を覚えておけば、いろいろと応用も利くと思います。

XMLサイトマップを出力するカスタマイズ

まずは functions.php に、以下のように追記します。

そして、テーマファイルに以下の内容で、feed-sitemap.php というファイルを作成します。

前提知識 WordPressのフィード

ご存知の方は読み飛ばしてください。

WordPressには、標準でXML形式等のRSSフィードを出力することができます。

https://{your-domain}/feed/
https://{your-domain}/feed/atom/

などで、各形式のフィードにアクセスできます。

普段WordPressのテーマをカスタマイズしている方でも、フィードが出力されるロジックはよくわかっていない方が多いのではないでしょうか。

まず、フィードのURLにアクセスした場合、WordPress標準のリライトルールに従って、

/feed/ → index.php?feed=feed

/feed/atom/ → index.php?feed=atom

などのようにリライトされ、クエリ変数 $feed に値がセットされます。

クエリ変数 $feed に値がセットされていると、do_feed_{$feed} というアクションが実行されます。

そして、このアクションの中で、load_template() が実行され、フィード用のテンプレートが読み込まれるわけです。

デフォルトで用意されている何種類かのフィードに対応するテンプレートは、全て /wp-includes/ の中に配置されていますが、

もちろん do_feed_{$feed} に独自の関数をフックして、テーマフォルダ内に置いた独自のフィードテンプレートを読み込ませることも可能です。

XMLサイトマップ出力の解説

では、さきほどのソースコードを見ていきましょう。

存在しない sitemap.xml にアクセスすると、当然のことながら404エラーになり、404テンプレートが表示されてしまいます。

そこで、rewrite_rules_array フィルタにフックして、リライトルール(WordPressのルーティングルール的なもの)を追加します。

専用に投稿タイプを作っても良いのですが、”sitemap” という名前のフィードにリライトしています。

言い換えると、クエリ変数 $feed に “sitemap” という値をセットしています。

 

“sitemap” という名前のフィードはデフォルトでは存在しないので、そのままだとエラーになります。

前述のとおり、この場合には、do_feed_sitemap というアクションが実行されますので、

このアクションに関数をフックして、テーマフォルダ内の feed-sitemap.php を読み込むようにします。

 

feed-sitemap.php では、投稿ループを用いて、各投稿のURLや更新日などをXMLの要素として出力していきます。

この例では、トップページと標準投稿の個別ページしか出力していません。

カテゴリアーカイブやカスタム投稿などを出力したければ、

get_posts() で各種投稿を取得してループする(または pre_get_posts アクションにフックして対象の投稿タイプを変える)、

テンプレート内で get_terms() によりタームの一覧を取得してループするなど、個別に対応していきます。

基本的には、各種ページ用のテンプレートと同じです。

XMLサイトマップを独自実装しようなどと考える皆さんなら朝飯前ですね。

サイトマップのURLの末尾にスラッシュがついてしまう問題

パーマリンク設定の末尾にスラッシュが入っている場合、

https://{your-domain}/sitemap.xml

にアクセスしようとしたら、

https://{your-domain}/sitemap.xml/

にリダイレクトされてしまいます。

サイトマップ用のテンプレートが表示されるにはされるのですが、これではあまりよろしくないですね。

パーマリンク設定末尾からスラッシュを取り除けば解決するのですが、全部のページのURLが、若干とはいえ変わってしまいます。

そこで、自動で末尾にスラッシュをつける(トレイリングスラッシュ)処理を、sitemap.xml に対してのみ除外します。

redirect_canonical というフィルタに処理をフックしています。

見慣れないフィルタですが、WordPressがURLを正規化する処理の中に用意されているフィルタです。

サイトマップが重い問題

サイトマップは基本的にはサイトの全ページを出力するので、件数が多くなってくると、非常に重くなります。

ユーザがアクセスするわけではないので、多少レスポンスが遅いのは問題ないかもしれませんが、

URLと更新時刻くらいしか出力しないわけなので、わざわざ WP_Post オブジェクトや WP_Term オブジェクトを介さずに、

$wpdb を引っ張り出して、SQLで直接一覧データを取得・出力したほうが、いくらか早いでしょう。

 

ただし、そもそもXMLサイトマップには、1ファイルあたり5万URL、50MBまでという制限があります。

シンプルなXMLサイトマップなら、1URLあたり1KBもいかないと思いますが、

投稿のパーマリンクがタイトルそのまま長い日本語だったり、

画像検索対策で、XMLサイトマップに各ページの画像のURLをたくさん入れたりしていると、

意外とこの制限にあっさり到達してしまうかもしれません。

そんな場合には、年ごとや投稿タイプごとにサイトマップを分割し、sitemap.xml をサイトマップインデックスにすることになります。

XMLサイトマップを分割する

とりあえず勘所だけ書いておきます。

  • query_vars フィルタを使ってクエリ変数を追加。例えば $sitemap 。
  • リライトルールを変更し、sitemap-{$type} を動的にリライトする。そしてこの $type をクエリ変数 $sitemap に突っ込む。
  • pre_get_posts アクションなりで、クエリ変数 $sitemap に応じて、投稿の取得条件を変える。

気が向いたらサンプルコード書きます。

・・・

あ、このブログのXMLサイトマップ、プラグイン使ってた。

Plugin Outbound Posts – 記事リスト内に外部リンクを挿入

Outbound Posts – 記事リスト内に外部リンクを挿入

投稿のリストの中に、見た目は他の投稿のリンクと同じように、外部リンクを差し込みたい、なんてことはありませんか? こんな風に・・・ Outbound Posts は、このような記事風の外部リンクを簡単に投稿できるプラグインです。 このプラグインを有効化すると、各記事の投稿画面に、「外部リンク」という欄が現
Column WordPressが重い・遅いときは、まず「プラグインのスリム化」をしよう 〜調査篇〜

WordPressが重い・遅いときは、まず「プラグインのスリム化」をしよう 〜調査篇〜

WordPressが重い、遅い!? WordPressのサイトが重い、読み込みが遅いので高速化したい、という相談をよく受けます。 本シリーズでは、実際の高速化の実例を元に、事前調査から対応までの手順をご紹介します。 WordPressが遅い原因 経験上、WordPressが遅い原因の80%以上はプラグインの過剰使用です。 プラグイン
Column WordPressにXMLサイトマップを独自実装するカスタマイズ

WordPressにXMLサイトマップを独自実装するカスタマイズ

WordPressに限らず、SEO対策に不可欠なXMLサイトマップ。 カスタマイズせずとも「Google XML Sitemaps」などのプラグインで瞬殺なわけですが、 多くのXMLサイトマッププラグインは、柔軟に設定できるように作られている分、 「このサイトでは要らない機能」がたくさん含まれることになるので、多少なりともリソー
Plugin AD5 LOYALTY – WordPressで会員制サイト作成

AD5 LOYALTY – WordPressで会員制サイト作成

当サイトで使用しているプラグインです。 WordPressのサイトを簡単に会員制サイトにすることができます。 ショートコードで簡単に会員登録フォーム、ログインフォームが設置可能で、全ての投稿に対して、会員用コンテンツと非会員用コンテンツを設定することができます。 ショートコートで簡単に会員登録フォーム
Column WordPressテーマ・プラグイン開発時のセキュリティ対策

WordPressテーマ・プラグイン開発時のセキュリティ対策

WordPressのテーマやプラグインを開発、カスタマイズする際には、脆弱性を生まないよう、セキュリティ対策を十分に考慮する必要があります。 CSRF対策 管理画面内外を問わず、WordPressにリクエストを送信するフォームや、データを更新するAJAXを実装する場合には、CSRF対策を施しましょう。 リクエストを送信する
Plugin Mobile Sticky Footer – スマホ用固定フッター

Mobile Sticky Footer – スマホ用固定フッター

Mobile Sticky Footerは、スマートフォンサイトに簡単に固定フッターを設置できるWordPressプラグインです。 選べる3タイプのレイアウト 複数ボタンタイプは2ボタンから5ボタンまで設定可能。 お問合せフォームやSNSへのリンクのほか、電話ボタンの設置も可能です。 リアルタイムプレビューつきの直感的な設定画
Column WordPressにメールフォームを自力で実装する

WordPressにメールフォームを自力で実装する

WordPressにメールフォームを実装する優秀なプラグインは沢山ありますが、 ほとんどのプラグインは非開発者向けに導入しやすさを重視して作られているため、 例えば入力項目を動的にするなど、少し複雑なことをしようと思うと、 詰んでしまいます。 WordPressにはメール送信処理やデータの保存などを簡単に実装できる
Plugin WP LOYALTY Checkout add-on – クレジットカード決済

WP LOYALTY Checkout add-on – クレジットカード決済

当サイトで使用しているプラグインです。 AD5 LOYATYのアドオンとして、決済機能を提供します。 決済サービスとして、カード決済手数料が3.0%〜と安く、個人事業主でも利用可能なPAY.JPと連携できます。 (別途PAY.JPのアカウントが必要です。)
Column WordPressのテーマファイル構成を本気出して考えてみた

WordPressのテーマファイル構成を本気出して考えてみた

エンジニアの端くれとして、たかがWordPressテーマであっても、綺麗なモジュール設計がしたいわけです。 そこで、以前作ったサイトのテーマをモチーフに、テーマファイルを再設計してみました。 対象にしたサイトは、ユーザーが会員登録し、PDFコンテンツを投稿でき、ダウンロード結果を集計できるなど、そこそこ高機
Column WordPressサイトにパンくずリストをプラグインなしで実装する

WordPressサイトにパンくずリストをプラグインなしで実装する

意外と大変なパンくずリスト WordPressサイトに限らず、SEOの面でも重要視されるパンくずリスト(breadcramb nav)。 WordPressでガチで実装すると意外と面倒ですよね。 個別投稿ページだけでも、 A. 標準投稿 HOME > 親カテゴリ > 子カテゴリ > 投稿名 B. 固定ページ HOME > 親ページ >
 
ログイン
メールアドレス
パスワード
会員登録
お名前
メールアドレス
パスワード
購入手続き
カード番号
有効期限 (MM/YY)
/
セキュリティコード (CVC)