WPのpre_get_postsを使う

2013/06/18

wordpressのpre_get_postsを使う

特定のカテゴリを表示とか、特定のカテゴリを除いて表示とかやろうとしていて…
「query_posts」を使っていた。

最近、「pre_get_posts」というヤツの存在を知り、調べていると「pre_get_posts」を使うべきだと。
「query_posts」を使うとクエリを2回実行して「ヨクナイ」とある。

ページが表示されるフロー

とりあえずページが表示されるフローをつくってみた。
たぶんこんな感じ。

Cap2013-06-18-13-27-57-8690969

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」だとできない感じっぽい。使い分けする必要があるっぽい。

新着(ニュース関連以外)

2018-07-26
年賀状で「新春」とか書くけど・・・何故なんだろうと8月を目前にした今、疑問に思った。
2018-05-16
PHPで画像のヘッダ情報(?)の「Orientation」を元に画像回転させたい。
2018-03-05
Android Studioをインストール。エミュレータを軽くするトコまで終わらせたかったけど、挫折した。
2018-02-23
プッシュ通知について調べてた時にでてきたServiceWorker。そのServiceWorkerについてのメモ。
2017-12-13
jqueryで取得したDOM要素をオブジェクトじゃなくて、配列で受け取りたい