前回に引き続き、wordpressの新テンプレ開発の備忘録です。
前回はquery_posts関数の使用をやめる方法を検討してみたわけですが、今回はトップページにサブクエリを作成する方法を試してみます。
どういうサブクエリを作成したいかといえば、「この投稿を先頭に固定表示」にチェックをつけた記事のうち最新のものを3件表示するためのクエリ。
ちなみに、このクエリを使って呼び出した記事でトップページに「カルーセルパネル」を設置したいな~なんてことを構想しています。
今まで使っていたテンプレートではサブクエリの発行にもquery_posts()を使っていたんですが、それがあまりよろしくないというのが前回の記事で書いた話。
サブクエリの発行はget_posts()、もしくはWP_Query()を使うのが良いということなんですが、じゃあどっちを使えばいいんでしょう?
というわけでいろいろググってみたんですが、実はget_posts()も最終的に処理の中でWP_Query()をコールしていて。
(もっと言えば、query_posts()も、pre_query_posts()もWP_Query()を使っています。実装は「wp-includes/post.php」を参照してみてください!)
そう考えると、「WP_Query()」を使ってみるのが一番本質の理解につながるのかな〜。
もしかしたら、WP_Query()を直で呼ぶのはメモリを余計に使うなんてことがあるのかもしれませんが、ひとまず今回はWP_Queryの使い方を覚えてみることにします。
(「いやいやそりゃ無いわ!」というご意見がありましたら、教えてくれると嬉しいっす!)
というわけで実際に書いてみた処理は以下の通り。
$args = array( 'posts_per_page' => 3, 'post__in' => get_option('sticky_posts'), 'ignore_sticky_posts' => 1, ); $the_query = new WP_Query( $args ); if ( $the_query->have_posts() ) : while ( $the_query->have_posts() ) : $the_query->the_post(); // 表示処理をここに書く。 endwhile; endif; wp_reset_postdata();
必要としている記事を呼び出すためのパラメータは以下の部分。
'posts_per_page' => 3,
ここで表示件数を3件に指定しておいて、
'post__in' => get_option('sticky_posts'),
post__inで「“この投稿を先頭に固定表示”にチェックがついた記事(sticky_posts)」を指定しています。
ただ、これだけだと表示件数(posts_per_page)が無視されて、固定表示の記事が全件表示されてしまいます。
まあ、明示的に「先頭に固定表示」と言っているわけですから、動きとしては確かに正しい。
なので、以下のように「先頭に固定表示のチェックを無視する」という設定(ignore_sticky_posts)を指定する必要があるわけです。
'ignore_sticky_posts' => 1,
結局やっていることは「先頭に固定表示させた記事を3件表示し、先頭の固定表示を無視する」という感じ。
言葉として書くとなんだかややこしい感じますが、この設定で「先頭に固定表示した記事を3件」という期待通りの表示をすることができます。
というわけで、トップページにメインクエリとは別で「先頭に固定表示にチェックがある記事を3件表示」することが出来ました。
これをカルーセルパネルにするのはjQueryのお仕事なのでまた別のお話。
というわけで、今回はここまで!
テンプレ開発状況はこんな感じ!
wordpressのお勉強のついでに、GitHubの使い方も勉強してみよう!ということで、今回のテンプレート開発はGitHubでバージョン管理をすることにしました。
決して人様にお見せできるようなコードではないんですが、無料ユーザは非公開での開発ができないので、以下で恥をさらしてみようと思います。
/ultimate-ez/ultimateez_v3
素人のひどいコードに対して文句を言いたくなるところもあるかもしれませんが、お手柔らかにお願いします。。