カスタム投稿タイプの記事をカテゴリアーカイブページに含ませる

カスタム投稿タイプに標準タクソノミーである「カテゴリー」を紐付けても、カテゴリアーカイブページでは表示されません。

なんでかっていうと、まあそういう仕様だからしゃーないと。

「何とかデフォルトで(プラグインに頼らず)、カスタム投稿タイプの記事を含ませる方法はないか」という質問を受けたので、ニッチだなぁと思いつつも、すっきりしないまま寝るのは気持ち悪いので調べてみました。

結論

できました。

テンプレートごとに使われるメインクエリーにpost, pageだけではなくカスタム投稿タイプを含ませるという手法。

フックは pre_get_posts を使用します。

function add_cpt_in_main_query( $query ) {
    if (!is_admin() && $query->is_main_query() && is_category() ) {
        $query->set( 'post_type', [ 'post', 'my_cpt', 'nav_menu_item' ] );
    }
    return $query;
}
add_filter( 'pre_get_posts', 'add_cpt_in_main_query' );

my_cptの部分は自分で設定したカスタム投稿タイプに置き換えてください。

また、set('post_type',['post', 'my_cpt']) の部分は set('post_type', 'any') としてもOKです。

※修正(2020年12月): add_filterの部分がadd_actionとなっていたので修正しました。

※追記(2020年1月): 条件分岐にis_categoryを追加しました(ってかこれが肝ですw)

心配事別案

フックにて一括で変更を加えてしまうと、メインクエリーが実行される度に余計な処理を挟むわけなので、パフォーマンス的にどうよという心配事があります。

カテゴリアーカイブページのみ、テンプレート内でWP_QUERYで新しいクエリを作ったほうが良い気がします。

WordPress 仕事の現場でサッと使える!デザイン教科書

オリジナルテーマを作成するのにもってこいの逆引き的なWordPress教科書。実務的で中級者〜という印象。WP使うなら持っておきたい良書。