WordPress標準のXMLサイトマップ出力機能で特定カテゴリに含まれる全ての記事を除外する

黒板を消している学生
©いらすとや.

WordPress 5.5から搭載されたXMLサイトマップ出力機能(コアXMLサイトマップ)は標準状態ではいろいろ機能が足りないのでとてもじゃないけど「そのまま使います」とはいかない代物。「がとらぼ」ではこれまで幾つかこのコアXMLサイトマップを使い物にしようとする記事を上げているが、必要な機能は「既に出回っているコードを組み入れて下さい」みたいなことを書いていた。
ググると、「この記事は(noindexにしているから)サイトマップに入れたくない」を実現するコードは多く出回っているのですぐに見つかる。同様に「このカテゴリはサイトマップに入れたくない」を実現するコードも多く出回っている。
しかし、この「カテゴリを除外するコード」というのは子サイトマップ /wp-sitemap-taxonomies-category-数字.xml から https://ドメイン名/archives/category/指定カテゴリ を除くものであって、それ以外の何物でもない。 つまり、カテゴリに含まれる記事そのものは全く何も影響されない。考えてみれば、カテゴリ「盆栽」を除外したいと考えているサイトオーナーは盆栽カテゴリを示すURLだけを除外したいわけではない筈。盆栽カテゴリに含まれる記事も除外したい筈よね? コアXMLサイトマップではなくXMLサイトマップ出力プラグインでカテゴリ除外機能を搭載しているものはそうなってる筈。(全部確認したわけではないけど)
結構がんばってググってみたが、その「指定カテゴリに含まれる記事の除外」が見つからない。

欲しい機能が見つからないなら欲しいと思った人が作れば良い。
作ってみた。 (誰でも作れる超カンタンなものですが)

指定カテゴリに含まれる全ての記事をサイトマップから除外するコード

1
2
3
4
5
6
functions bny_exclude_posts_and_categoey_from_sitemap($args) {
  $args['post__not_in'] = array( 110, 111, 112, 113, 558 ); //投稿&固定記事のIDをカンマ区切りで指定
  $args['category__not_in'] = array( 1, 5, 6 ); //カテゴリIDをカンマ区切りで指定 カテゴリに含まれる記事の除外なので注意 
  return $args;
}
add_filter('wp_sitemaps_posts_query_args', 'bny_exclude_posts_and_categoey_from_sitemap', 10, 2 );

2行目、「この記事とこの記事は除外したい」を実現する投稿&固定記事をID指定で除外するコードはよく出回っている。これは普通に使いたい機能なので「カテゴリに含まれる全ての記事を除外」とは別に用意しておく。上のコードでは記事ID 110, 111, 112, 113, 558の5つの記事を除外している。
3行目がこの記事の本題の部分、指定したカテゴリIDに含まれる全ての記事を除外するもの。上のコードではカテゴリID 1, 5, 6の3つのカテゴリを除外している。この内、カテゴリID 1はWordPressが自動で作成する「未分類」カテゴリです。つまりカテゴリID 1を除外したなら「未分類」カテゴリの記事の全てがサイトマップから除外されます。

これで、ほぼコアXMLサイトマップではダメだという理由がなくなりました。
「がとらぼ」では長らく(Google) XML Sitemapsプラグインを使ってきましたが、これでコアXMLサイトマップに切り替えました。(他に所有している新しめのウェブサイトは既にコアXMLサイトマップにしています)

関連記事: