1000本突破
1000本突破

WordPressのバージョン5.5.0から追加されたXMLサイトマップ自動出力機能を紹介

小林

WordPress5.5.0から追加された新しい機能についてご紹介します。

この記事を執筆中のWordPressの最新バージョンは5.8.2なので、なんで今更と思われてしまうかもしれませんが、少し驚いた機能だったのでこうして記事にしてしまいました。

WordPressはXMLサイトマップを標準で出力する? しない?

これまでWordPressではXMLサイトマップはそのままでは出力されませんでしたので、プラグインを利用したり、または自前で用意したりといったかたちで対応をしてきたと思います。あるとき、WordPressをいじっているとまだ準備していないはずのXMLサイトマップが出力されていることに気づきました。

WordPress5.5からはデフォルトでXMLサイトマップが出力されるようになっていたのです。それがどのような機能なのかを簡単に見ていきたいと思います。

XMLサイトマップには、設定されているパーマリンク設定に応じて

  • /?sitemap=index
  • /wp-sitemap.xml

でアクセスできます。

/wp-sitemap-posts-post-1.xml
/wp-sitemap-posts-page-1.xml
/wp-sitemap-taxonomies-category-1.xml
/wp-sitemap-users-1.xml

アクセスするとサイトマップインデックスが出力されており、初期状態では投稿および固定ページのURL、カテゴリーおよびユーザーのアーカイブへのURLが記載されています。

特別な設定をすることもなく、WordPressに記事やページを投稿していけば、それが自動的にXMLサイトマップに出力されていくことになります。

部分的に出力を止めたい場合

では、タクソノミーやユーザーのアーカイブは利用しないのでサイトマップに記載したくない、といった場合は、どうのように対応すればいいのでしょうか。

中身を見てみます。

public function register_sitemaps() {
        $providers = array(
            'posts'      => new WP_Sitemaps_Posts(),
            'taxonomies' => new WP_Sitemaps_Taxonomies(),
            'users'      => new WP_Sitemaps_Users(),
        );

        /* @var WP_Sitemaps_Provider $provider */
        foreach ( $providers as $name => $provider ) {
            $this->registry->add_provider( $name, $provider );
        }
    }

このような形で各種サイトマップ提供用のインスタンスを登録しています。

 

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

ユーザーのアーカイブであればusersという名前で登録していますので、例えばユーザーアーカイブのサイトマップ出力を停止したい場合は、下記のフィルターフックを利用することによって実現できます。

また、カスタム投稿タイプの場合は、publicプロパティが真の状態であれば、投稿サイトマップ提供用インスタンス内でサブタイプとして追加されるので自動的に出力されます。しかし、こちらもサイトマップには出力したくない場合は以下のフィルターで部分的に停止することもできます。

 

add_filter('wp_sitemaps_post_types', function($post_types){
    if(isset($post_types['cats'])) {
        unset($post_types['cats']);
    }
    return $post_types;
});

これはcatsとして登録した投稿タイプを、サイトマップに出力しないようにしています。

出力を追加したい場合

新しい出力を追加したい場合は、このサイトマップ提供用のインスタンスを別途用意することで実現します。

例えば、サイトマップへの出力を複雑な条件で出しわけたいとか、同じサーバーにあるWordPressで管理しないページもサイトマップに含めたいといったケースで利用します。

<?php

class Sitemaps_Files extends WP_Sitemaps_Provider {

    public function __construct() {
        $this->name        = 'files';
        $this->object_type = 'file';
    }

  public function get_url_list( $page_num, $object_subtype = ''  ) {
    // サイトマップに出力したいURL
        // 本来であれば、サブタイプやページ数の指定で出し分けるように
    $url_list = array(
         array('loc' => 'https://example.com/aaa.html'),
         array('loc' => 'https://example.com/bbb.html'),
         array('loc' => 'https://example.com/ccc.html'),
    );

        return $url_list;
    }

    public function get_max_num_pages( $object_subtype = '' ) {
        return 1; // 必要なサイトマップのページ数
    }
}

まず、サイトマップ提供用のクラスを用意します。抽象クラスが用意されているので、それを利用します。

 

add_action('wp_sitemaps_init', function($wp_sitemaps){
        // 作成したクラスが読み込まれているものとして
    $wp_sitemaps->registry->add_provider('files', new Sitemaps_Files());
});

クラスを用意したら、サイトマップの初期化処理時のアクションフックで追加するだけです。これだけでwp-sitemap-filesというタイプのサイトマップが追加されて出力されます。

XMLサイトマップの出力自体を停止したい

最後に、これまでどおりプラグインや自前で対応するので、これらの機能をすべて停止したい場合です。

add_filter('wp_sitemaps_enabled', '__return_false');

こちらのフィルターでまとめてコントロールできます。

WordPress本体に含まれていくのはうれしい反面、これまでと比べて挙動が変わって驚くこともあるので、しっかり機能を把握して適切に利用できるようにしていきたいですね。

n u l l