昨日までわからなかったわたしが したり顔で解説するpre_get_posts
こんにちは、フロントエンドの、のりこです。
『query_postsを使うのをやめよう、pre_get_postsを使おう』
と業界がざわざわし始めてから1年以上が過ぎましたが、まだquery_postsを使っていますか?
正直に言いましょう。
私も真剣にpre_get_postsを使えるようにならなくては…と思い立ったのは実は昨日です!f(^^;)
pre_get_postsを使うメリットは?
メリットがわからないことをわざわざ勉強する気にならないですよね。そう、かく言うわたしもそうでした。
じゃあ、メリットは?ズバリ!
無駄が無くなります!
無駄が無くなるということは・・・
処理が速くなります!
(あとはquery_postsでページ送りがおかしくなるetc.の細かい仕様から開放されます)
query_postsがなぜ無駄なのか
メインクエリー、略してエリー先生は朝必ず生徒の日誌(投稿)を職員室で人数や内容を確認し、順番を揃えてから教室に行きます。
教室に行ったら、教室で突然query_postsさんが
「エリー先生。○○さんの日誌は今日いらない。あと、今日は順番を降順じゃなくて昇順にしてきてよ!」
と上から目線で命令してきました。
query_postsさんに命令されるとエリー先生は、教室がたとえ4F建ての校舎の4Fの一番端っこにあったとしても、職員室(まあ大体は1Fにありますよねw)に一回帰ってから職員室で○○さんの日誌を取り払い、わざわざ降順に並べていたものを昇順に並べなおしてから再度教室に向かいます。
エリー先生、超しんどい!!!
pre_get_postsだとどうなるのか
エリー先生は朝、生徒の日誌(投稿)を職員室で人数や内容を確認し、順番を揃えようとしていました。
そうしたらpre_get_postsさんが
「エリー先生。○○さんの日誌は今日いりませ~ん。あと、今日は降順じゃなくて昇順にしていって欲しいで~す!」
と指示をしてくれました。
エリー先生は行ったり戻ったりせずにスマートに日誌を教室に運ぶことができたのです。めでたしめでたし。
ゆるい語尾の割にはpre_get_postsさん、なかなかできる子です。
怯まずfunctions.phpに追記しよう!
エリー先生に教室(各テンプレート)にたどり着いてから命令をしようとするから、それまでにやってきた作業をいったん無駄にしてしまったり、職員室で「日誌は5枚セットが基本」と決まっているにもかかわらず、その基本をいじらないでquery_postsさんだけが「教室の中では10枚セットで数えるわよ!」と自分勝手に言っちゃうのでページ送りが狂ってしまったりするのです。
pre_get_postsさんはエリー先生の作業に事前に割り込むためにfunctions.php(職員室側)に記述することになります。
functions.phpに書き込んじゃうということは、管理画面や諸々のクエリー全部へ命令をしてしまうことになるので管理画面である場合とメインクエリーじゃない場合は除外するというif文をまず書いておきましょう。
function custom_main_query($query) { if(is_admin() || ! $query->is_main_query()) return; //ここにテンプレート種類ごとの命令文を書く } add_action( 'pre_get_posts', 'custom_main_query' );
最近私が個人的に使ったのは、カスタム投稿【試合結果(game)】のアーカイブを投稿日順ではなく試合日順(カスタムフィールド:gDate)で並べ替えるといったものだったのですが
function custom_main_query($query) { if(is_admin() || ! $query->is_main_query()) return; if ( $query->is_archive('game') ) { $query->set('orderby', 'meta_value'); $query->set('meta_key', 'gDate'); } } add_action( 'pre_get_posts', 'custom_main_query' );
と、このように比較的簡単にpre_get_postsを使って書いてあげることができます。
ソースは無駄なくスッキリ!を目指したいですね!!
何日か先輩の、のりこでした <(`^´)>ドヤッ!