デフォルトで出力されるwp-sitemap.xmlのカスタマイズ

2022.03.16 2022.05.17

WordPress 5.5より標準でwp-sitemap.xmlというXMLサイトマップが出力されますが、最低限の情報しか持っていないため、カスタマイズしていきたいと思います。

2022.05.17 投稿タイプを除外を追記しました。

サイト内のURLのリストが記述されたファイルで、クローラーがサイト内を巡回する際の参考となるもので、サイト上のページや記事、更新された情報を見つけやすくするためのものです。

標準機能であるサイトマップ(wp-sitemap.xml)は、https://(domain name)/wp-sitemap.xmlで確認することができます。

コア標準のサイトマップでの問題点をあげるなら、以下の2つが思いつきます。

  • 登録したくないURLがサイトマップに登録される
  • lastmodの項目が追加されないので、更新日時を通知できない

更新頻度が低い小規模なサイトであれば問題とならない場合もあるのですが、サイトマップが自動的に作られるだけという基本的な機能しかないので、更新頻度が高いサイトなどでは問題となる可能性があります。

サイトマップを有用に使いたい場合は、自力でカスタマイズしたり、XML SitemapsYoast SEO などのプラグインを使った方がよいでしょう。

wp-sitemap.xmlを無効化する

add_filter( 'wp_sitemaps_enabled', '__return_false' );

XML SitemapsYoast SEO などのプラグインでサイトマップを出力している場合は、wp-sitemap.xmlを無効化するコードが入っているので特に気にする必要はないと思います。

必須となる項目(urlset url loc)は標準で実装されているので、オプションとなる更新日lastmodなどの項目を追加していきます。

wp_sitemaps_posts_entryというフィルターフックを使います。

最終更新日lastmodの他、更新頻度changefreqや優先順位priorityも追加してみます。

add_filter(
  'wp_sitemaps_posts_entry',
  function( $sitemap_entry, $post, $post_type ) {
    $modified_jp = get_the_modified_time('c', $post->ID);
    // 固定ページ
    if ( 'page' === $post_type ) {
      $sitemap_entry['lastmod'] = $modified_jp;
      // トップページ
      if ( 'home' === $post->post_name ) {
        $sitemap_entry['changefreq'] = 'daily';
        $sitemap_entry['priority'] = 1.0;
      } else {
        $sitemap_entry['changefreq'] = 'monthly';
        $sitemap_entry['priority'] = 0.7;
      }
    }
    // 投稿、カスタム投稿タイプなど
    else {
      $sitemap_entry['lastmod'] = $modified_jp;
      $sitemap_entry['changefreq'] = 'weekly';
      $sitemap_entry['priority'] = 0.7;
    }
    return $sitemap_entry;
  },
10, 3 );

それぞれのオプション項目は以下のようになっています。

最終更新日(lastmod)W3C Datetime形式で記述する必要がある
優先順位(priority)0.0〜1.0の値で指定
指定しない場合は、すべて0.5になる
更新頻度(changefreq)always / hourly / daily / weekly / monthly / yearly / never のいずれかで指定

wp_sitemaps_add_providerというフィルターフックを使います。

add_filter(
  'wp_sitemaps_add_provider',
  function ( $provider, $name ) {
    return ( $name == 'users' ) ? false : $provider;
  },
10, 2 );

wp_sitemaps_posts_query_argsというフィルターフックを使います。

固定ページでお問い合わせフォームの完了ページなどを作っている場合は、そのページを除外します。

add_filter(
  'wp_sitemaps_posts_query_args',
  function( $args ) {
    $args['post__not_in'] = isset( $args['post__not_in'] ) ? $args['post__not_in'] : [];
    // pageをすべて取得
    $sitemap_pages = get_pages();
    foreach ( $sitemap_pages as $sitemap_page ) {
      $page_name = $sitemap_page->post_name;
      // 除外したい「done」というスラッグがあれば、post__not_inにIDを入れる
      if ( $page_name === 'done' ) {
        $args['post__not_in'][] = $sitemap_page->ID;
      }
    }
    return $args;
  }
);

wp_sitemaps_post_typesというフィルターフックを使います。

カスタム投稿タイプなど特定の投稿タイプをを除外します。

add_filter (
	'wp_sitemaps_post_types',
	function( $post_types ) {
		unset( $post_types['post'] ); // 投稿
		unset( $post_types['page'] ); // 固定ページ
		unset( $post_types['カスタム投稿タイプ'] ); // カスタム投稿タイプ
		return $post_types;
	}
);

その他にもフィルターフックは用意されているようなので、ドキュメントを参照してください。

カスタマイズ記事を書いていて思ったのですが、プラグインを使ったほうがいいです(笑

Share this!
この記事を書いた人
今西 昭男
フリーランスのディレクター兼WEBサイト制作者です。
WordPressを使った制作やECサイトの構築などお気軽にご相談ください。
Stack Nagoya

Stack Nagoya

主にウェブ制作やグラフィックデザインをバックグラウンドに持つメンバーで構成される有志団体。ウェブやグラフィックだけでなく、いろいろなデザインについて学ぶイベントを企画・運営していきます。

Adobe XD User Group NAGOYA

Adobe XD User Group名古屋

ワイヤーフレーム・UIデザイン・プロトタイピングの知識・経験などを、参加者全員で共有したり、最近の制作を取り巻くUXやそのツール・プロセスについて勉強することを目的にしています。

制作のご相談はこちら