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

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

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

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

結論

できました。

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

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

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

set(‘post_type’,[‘post’, ‘my_cpt’]) の部分は set(‘post_type’, ‘any’) でもOKです。

心配事

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

そういったケースの場合はテンプレートを切り分けて(カテゴリアーカイブページのみとか)、WP_QUERYで新しいクエリを作ったほうが良い気がします。