やわらかしかっけい

なんでもすぐに忘れてしまう自分のために

pre_get_postsで気をつけること

ホーム画面に吐き出される記事一覧を、あるカテゴリーの記事に絞りたかった。

こういう時のための「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' );
?>

珍事発生

上記コードをfunctions.phpに書いて、

いざサイトを見てみたところ、

記事のカテゴリによる絞り込みはできていたが

ナビメニューが消えた。

忽然と、消えてしまった。

どのページを見ても、

<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' );
?>

参考

emiac-works.com

親切にも「必須」って書いてあるんだから、
勝手に削ったりしちゃダメ。