メインクエリを改変!home.phpでカスタムポストタイプの内容を出力させる方法。

カテゴリー:
WordPress
タグ:

WordPressサイトのトップページでカスタムポストタイプの投稿のみを表示させる方法をメモ。

is_main_query関数とpre_get_postsフックを使って、loopの記述を改変しなくてもhome.phpの出力内容を通常の投稿からカスタム投稿に変えることができるという手法です。

functions.phpに以下のコードを記述します。

home.phpが使われる時、つまりトップページが表示されるときにcustom-postという名前のカスタム
投稿が表示されるようになります。(カスタムポストタイプは予め作っておく。)

home.phpでは例えば以下のような通常のメインクエリを出力するloop処理を呼び出しています。

以下の様なメリットがあります。

is_main_query 関数と pre_get_posts フックを使う事で、テンプレートファイルにアクセスする前にメインクエリを改変することが可能です。つまり、二重にクエリの呼び出しを行わなくて済むというメリットがあります。
また、query_posts を使う方法だと、変更したいテンプレートファイルすべてに条件変更の記述をしなければなりませんが、is_main_query と pre_get_posts フックを使う方法は functions.php 一箇所に書けば大丈夫というメリットがあります。

引用元:WordPressでホームやアーカイブ毎に表示条件を変える(is_main_query と pre_get_posts フック) | Gatespace’s Blog

通常のループ処理だと”メインクエリ”を呼び出す、つまり通常の投稿内容を表示させることになるのですが、上記処理にてメインクエリを投稿からカスタム投稿に変更しているということのようです(home.phpが使われる場合に限って)。

ざっくばらんなまとめ(推測含む)。

add_action( ‘pre_get_posts’, ‘foo_modify_query_exclude_category’ );
→pre_get_postsにフックする関数foo_modify_query_exclude_categoryを指定。

if (! is_admin() && $query->is_main_query() && $query->is_home())
→関数foo_modify_query_exclude_categoryの条件を定義。条件は管理画面以外でメインクエリを呼び出しているとき、且つテンプレートがhome.phpである場合。

$query->set( ‘post_type’, ‘custom-post’);
→関数foo_modify_query_exclude_categoryの条件が満たされたら、$queryにcustom-postという投稿タイプをセットする。

以上の文脈から推測すると$queryがメインクエリのような気がします。

もっともっとまとめると、関数foo_modify_query_exclude_categoryが実行されてメインクエリが改変され、home.php(呼び出されたループ処理)によってhome.phpでカスタム投稿タイプが出力されるという流れ…なんだと思います。多分。

参考サイト:
WordPressをカスタマイズするなら覚えておきたいアクションフックとフィルターフック

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です