WPのpre_get_postsを使う
wordpressのpre_get_postsを使う
特定のカテゴリを表示とか、特定のカテゴリを除いて表示とかやろうとしていて…
「query_posts」を使っていた。
最近、「pre_get_posts」というヤツの存在を知り、調べていると「pre_get_posts」を使うべきだと。
「query_posts」を使うとクエリを2回実行して「ヨクナイ」とある。
ページが表示されるフロー
とりあえずページが表示されるフローをつくってみた。
たぶんこんな感じ。
pre_get_postsを使わず、query_postsを使う場合
ブラウザでURLを叩くと、DBにクエリを投げる。
その後、「query_posts」に従ってもう一回、DBにクエリを投げる。
pre_get_postsを使って、query_postsを使わない場合
ブラウザでURLを叩くと、「pre_get_posts」というアクションが実行される。
コールバック関数が指定されていれば実行して、DBにクエリを投げる。
注意事項
ブラウザでURLを叩くと、管理画面であろうがテンプレート(wp-content/themes/xxxx/)の「function.php」が実行される。
「wp-content/themes/xxxx/function.php」で「pre_get_posts」を「add_action」することになるので管理画面を開いたときも「pre_get_posts」で指定している「コールバック関数」に従って「DBにクエリを投げる」ということをしている。
例えば、
「トップページに「丸ごとシマウマ」というカテゴリの記事一覧を表示」
としたつもりが、
「管理画面でも「丸ごとシマウマ」というカテゴリの記事一覧を表示」
というような感じになってしまう。
それを防ぐために「is_admin()」とか使う必要がある。
雑記
私の求めているのはテンプレートの中で「Aという場所にはカテゴリ○○○だけ表示」「Bという場所にはカテゴリ○○○を除いて表示」としたい。
「pre_get_posts」だとできない感じっぽい。使い分けする必要があるっぽい。