
WordPressで作ったサイトのトップページに、投稿一覧とカスタム投稿タイプの記事も混ぜて新着記事が出力されるようにしようと思ったのですが、これがなかなかうまくいきませんでした。
一応最終的には解決したのですが、だいぶハマってしまい、2時間ぐらい検索してはfront-page.phpとfunctions.phpを触ってようやく解決する事ができました。
で、結論からいうと、functions.phpに以下のコードを挿入することで投稿一覧とカスタム投稿タイプの記事を混ぜて新着記事を出力させえることができました。
1 2 3 4 5 6 7 8 9 10 11 12 |
//投稿一覧とカスタム投稿タイプの記事を混ぜるコード function change_posts_per_page($query) { if ( is_admin() || ! $query->is_main_query() ){ return; } if ( is_front_page() && $query->is_main_query() ){ $query->set('post_type', array( 'post', 'test')); return; } } add_action( 'pre_get_posts', 'change_posts_per_page' ); |
ではコードの解説をしていきますね。
1 |
if ( is_admin() || ! $query->is_main_query() ){ return;} |
こちらのコードは、管理画面、そしてメインクエリに干渉をしないために記述しています。この記述は必須という認識が良いようです。
確かに、何かのエラーやプラグインとの競合で不具合が起こった時は管理画面から修正できなくなったり、無限ループに落ちいってしまうかも知れないですからね。
さて、次が本題のコードになります。
1 |
if ( is_front_page() && !$query->is_search() ){ $query->set('post_type', array( 'post', 'test')); return; } |
if文で条件設定です。
is_front_page()でWordPressのテンプレートであるfront-page.phpが使われている場合という条件設定し、次に $query->is_main_query()でメインループを実行中であることを判定しています。
&&で繋いで、どちらも同時に当てはまる場合の設定ですね。
この2つの条件に当てはまる場合に処理する内容としては、$query->set(‘post_type’, array( ‘post’, ‘test’))を記述しています。
$query->set(‘post_type’, array( ‘post’, ‘test’))は、ループして出力する対象の記事を指定います。
ここは少し難しいかも知れないですが、まずしていることはWordPressオブジェクトの$queryを使っています。
そして、queryのsetメソッドを使ってループで主力する投稿のタイプを指定しているんですね。
指定の仕方としては、post_typeで「セットするのは投稿のタイプです。」として、対象となるのは「array( ‘post’, ‘test’)」でpostとtestですよ、と指定います。
postは普通の「投稿」から投稿した記事。testはスラッグをtestとしているカスタム投稿タイプから投稿した記事です。
これで、サイトのトップページに「投稿」から投稿した記事とカスタム投稿タイプから投稿した記事の新着一覧を出力することができるようになります。
因みに、ループで使用しているコードは一般的な以下のコードです。
1 |
<?php if ( have_posts() ) :while ( have_posts() ) : the_post();?> |
ほどんどのWordPressサイトに使用されているループです。
なので、今回紹介した「投稿」から投稿した記事とカスタム投稿タイプから投稿した記事の新着一覧を出力するコードはほとんどのWordPressで使えると思います。
そして、最後に作った関数をアクションフックに登録します。
1 |
add_action( 'pre_get_posts', 'change_posts_per_page' ); |
使うアクションフックは、pre_get_posts。
pre_get_postsはクエリが実行される前のタイミングで指定することができるアクションフック。
このフックに作った関数を登録することで、メインクエリが実行されて、投稿の一覧が表示される前に、クエリの内容を書き換えることができます。