ホーム画面に吐き出される記事一覧を、あるカテゴリーの記事に絞りたかった。
こういう時のための「pre_get_posts」だと思ったので、
嬉々として利用。
悪い例
functions.php
<?php // homeの記事一覧をカテゴリID「2」の記事のみに限定 function change_posts_category($query) { if ( is_admin() ){ return; } if( $query->is_home() ){ $query->set( 'cat','2' ); return; } } add_action( 'pre_get_posts', 'change_posts_category' ); ?>
珍事発生
いざサイトを見てみたところ、
記事のカテゴリによる絞り込みはできていたが
ナビメニューが消えた。
忽然と、消えてしまった。
どのページを見ても、
<nav> </nav>
という感じで、メニューの中身がごっそり 無い。
原因
pre_get_posts を使用する際に、
「管理画面とメインクエリに干渉しないようにする」
という回避コードを書く必要があるのだが、
これを
「今回はトップページのループをいじるわけだから、(?)
メインクエリへの干渉を避ける必要はないだろ〜」
と、勝手に回避コードを省略してしまったのが敗因。
メインクエリのなんたるかを、まったくわかってなかった。
メインクエリがナビメニューにも関わっているなんて、
おら、知らなかっただ・・・・。
正解
<?php // homeの記事一覧をカテゴリID「2」の記事のみに限定 function change_posts_category($query) { if ( is_admin() || ! $query->is_main_query() ){ return; } if( $query->is_home() ){ $query->set( 'cat','2' ); return; } } add_action( 'pre_get_posts', 'change_posts_category' ); ?>