eyecatch_mod

【WordPress 4.0】新機能を試す – 投稿記事の表示順を複数の条件で指定!

久しぶりのショートホープです。ちょっと見てみたら前回の更新が4月でした本当にごめんなさい。日々の忙しさにかまけて更新をすっかりサボっていましたが、ちゃんと仕事はしてます。

先日、5年ほど使っていた白ポリカたん(MacBook 2008 Early)からMBP(MacBookPro 2013 Mid)にメイン機をバージョンアップしたものの、バタバタしてていつまでたっても環境の移行が終わらないorz そして速さに慣れない(´・ω・`)

いきなり告知

いきなりだが、この記事は来たる10/11(土)に大田区蒲田にある大田区産業プラザPiOで行われる、WordPressのイベントとしては日本で最大規模の「WordCamp Tokyo 2014」開催に向けてのリレーブログのひとつとして書いている。
昨日のwayさんの記事に引き続き、この記事がリレーブログの第二弾、ということになる。

ちなみに、こちらのイベントはすでに参加登録も開始され、タイムテーブルも随時更新されている。かくいう僕自身もスタッフとして参加する。年に一度の祭典でもあるので、普段からWordPressに携わっている制作者・ブロガーからこれから触ってみようという初心者まで、レベルは違ってもそれぞれがそれぞれのレベルで楽しめると思うので、都合がつくならば是非参加してみるといいと思う。当日の会場には「おもてなし担当」スタッフがいるので、例えば初めて来たけどよくわからない、とか知り合いがいなくて寂しいwとかあったらとにかく近くにいるスタッフに声をかけてみよう!

WordPress 4.0 リリース

WordPress 4.0 がリリースされてからもう1ヶ月近く経過したので、アップデート祭りも一息、といったところだろうか。ダッシュボードからのバージョンアップ時に途中で止まる、なんていう不穏な情報も出ているので、まだ様子見の人もいるかもしれない。
このエラーに関してはレンタルサーバの環境によるとのことなので、WordPress 日本語ローカルサイトから WordPress 4.0 本体をダウンロードし、FTP経由でアップロードするなどの方法がいいようだ。この件に関してはこちらの記事が大変詳しい。また、Codexのこちらのページも目を通しておくといいだろう。

さて、新機能

今回のバージョンアップは、公式サイトの“4.0という数字は私たちにとっては単に3.9の後、4.1の前の数字にすぎません”というMatt Mullenwegのコメントからもわかるように、単なるマイナーアップデートだという捉え方をされているようだ。

その中でも最も注目されているのはやはり言語設定が大幅に変わった点だろう。具体的な変更点などは「WordPress 4.0 における言語関連実装の変更とその注意点」に詳しいので、こちらの記事も参照していただきたい。

僕が注目している新機能は?

先日開催されたWordFes Nagoya 2014などでは一部セッションで発表されていたようだが、僕が最も注目している機能については残念ながらまだあまり触れられていない(気がする)。WordPressをCMSとして使っている制作者だけでなく、ブロガーの皆さんにもとても有用な機能だと思うので、ぜひここで紹介したいと思う。

注目記事を一覧の上の方に表示したいよね?

WordPressを利用した受託のCMS案件でも、普通にブログだったとしてもこういう要望って結構あるように思う。「注目記事」あるいは「おすすめ記事」として別枠にするほどではないけど、日付順の最新記事よりも上に注目して欲しい記事を掲載する、と考えるのはまぁ自然だと思う。まとめサイト、情報サイトの類ならば欲しい機能の一つだろう。

あ、すぐやりますよ!…あれ?

WordPress 3.9 までの場合、いざやろうとするとこれが意外と厄介。流れを追って説明したい。

1. まずは投稿記事を順序付けできるようにする

今回のデモ例では、ぱっと見で順序がわかりやすいようにタイトルを「◯月◯日の記事」とした。最初の設定そのままであれば日付の新しい記事から古い記事へ降順で記事が並ぶ。

image1_1

WordPressで投稿に序列をつけたいと思っても、デフォルトでは固定ページでのみページの順序付けが有効になっていて、いわゆる「投稿(デフォルトの“post”)」では序列がつけられない。そこでadd post type support関数を使って「投稿」に属性(page-attributes)を表示するよう指定する必要がある。

まずfunctions.phpに「属性」を追加するよう記述する。ここで記述する内容は以下のようになる。

2. 序列は大きい順に

固定ページを確認するとわかるが、page-attributesが有効になっていると、デフォルトでは「0」になる。
序列をつけるのが目的なので、ここが大きいほど上に来るように設定したい。ということで序列の基準は「指定順」、並び順は「降順」に設定する。

このデモでは投稿記事をindex.phpのメインクエリで表示するようにしたいので、pre_get_postsフックを利用してメインクエリを改変する。functions.phpへの記述は下記のとおり。

3. で、表示は?

これで表示させてみると…?あら?確かにpage-attributesで指定した記事は最初に表示されてるけど、その他の記事の順序が変だぞ…。 最新の記事のはずの9/22の記事がない…。

image2

更にページを送ってみると、page-attributesで抜けた日付(この場合は9/15分)のところに9/8の記事が入ってるwww なんでやねーん\(^o^)/オワタ

image3

これまでのWordPressでは、記事の取得の基準を指定するパラメータである「’orderby’」 と取得順を指定するパラメータである「’order’ 」がひと組みしか指定できなかったため、その他の昇順・降順などの序列の条件に関しては無視され、データベースに格納された順に記事を取得しているから、ということのようだが、実際はそれだけでもないようだ。この点に関しては深く触れない(知らないのでごめんなさい)。

そこで新機能

これが、WordPress 4.0 からは序列を個別に複数指定できるようになった。これまでなんで採用されなかったのwww

WordPress 4.0 の場合でも、投稿に page-attributes を指定するところまでは一緒。
pre_get_postsフックでメインクエリを改変するときに、今回のケースでは以下のように指定する。

ここの10行目の、「’orderby’」を配列で指定できるようになったところがこの記事最大の山場w こうすることで記事全体は日付での降順を維持したまま、page-attributes の「降順」を有効にすることができる。「’orderby’」のキーに対する値として「’order’」(‘DESC’か’ASC’)を記述するので、この場合別途「’order’」を記述する必要はない。

image4

先ほどと同様にページを送ってみると、page-attributesで抜けた日付のところも正しく並んでいるのがわかる。

image5

ここで1点注意。この記述

$query -> set( 'orderby', array( 'menu_order' => 'DESC', 'date' => 'DESC' ) );

だが、例えば

$query -> set( 'orderby', array( 'date' => 'DESC', 'menu_order' => 'DESC' ) );

とパラメータの記述順を逆にした場合では想定したような表示にならない。

これは、WordPressが構造上どういう順番で記事を取得しているか、という点に関連している。つまり、こういった条件があった場合はまず最初に書いてある条件でソートした結果を取得し、それから次に指定してある条件でソートする、ということが繰り返されていく。なので、「先に書いてある条件が優先される」ことになるのだ。

いずれにせよ、やっと本来あるべき形になったという気がしなくもないwが、これで一件落着!やったー、気持ちいいー!あぁスッキリしたwww

まとめ

いままであれこれループを組み合わせてみたり複雑なことをしないと実現できなかったことが、いとも簡単に表示できるようになった。これだけでも WordPress 4.0 にバージョンアップしたいと思う動機になる、と思うのは僕だけ?なかなか使える新機能ながら「カスタマイズ」と言われる部類の中では比較的手軽だと思うので、機会があったら是非試してみて欲しい。

最後に、この「WordCamp Tokyo 2014」のリレーブログ、次回はピクセルデザインのしょーこさん担当と聞いている。しょーこさんもWP-Eのメンバーだけど、ご自分の会社のブログからの参加とのこと。しょーこさん、よろしくお願いします!

参照記事

A more powerful ORDER BY in WordPress 4.0
Class Reference/WP Query

special thanks : 黄色いおじさん

コメントを残す

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