WordPress 5.5より標準でwp-sitemap.xmlというXMLサイトマップが出力されますが、最低限の情報しか持っていないため、カスタマイズしていきたいと思います。
sitemap.xmlとは
サイト内のURLのリストが記述されたファイルで、クローラーがサイト内を巡回する際の参考となるもので、サイト上のページや記事、更新された情報を見つけやすくするためのものです。
wp-sitemap.xml
標準機能であるサイトマップ(wp-sitemap.xml)は、https://(domain name)/wp-sitemap.xml
で確認することができます。
コア標準のXMLサイトマップの問題点
コア標準のサイトマップでの問題点をあげるなら、以下の2つが思いつきます。
- 登録したくないURLがサイトマップに登録される
- lastmodの項目が追加されないので、更新日時を通知できない
更新頻度が低い小規模なサイトであれば問題とならない場合もあるのですが、サイトマップが自動的に作られるだけという基本的な機能しかないので、更新頻度が高いサイトなどでは問題となる可能性があります。
サイトマップを有用に使いたい場合は、自力でカスタマイズしたり、XML Sitemaps やYoast SEO などのプラグインを使った方がよいでしょう。
wp-sitemap.xmlを無効化する
add_filter( 'wp_sitemaps_enabled', '__return_false' );
XML Sitemaps やYoast 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 のいずれかで指定 |
USER を表示しない
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;
}
);
その他にもフィルターフックは用意されているようなので、ドキュメントを参照してください。
まとめ
カスタマイズ記事を書いていて思ったのですが、プラグインを使ったほうがいいです(笑