なんとか頑張ってます。10日目。
今日の質問はこちら。
投稿の順番を入れ替えたいときはどうすればいい?
投稿を…入れ替え?
まず、投稿の順番を入れ替える必要がある状況ってのがどういうときなのかを考えてみますと…
おそらくCMS的使い方でトップページに載せたい記事とかを投稿にして「TOPページ表示」みたいなカテゴリを作って、index.php (home.php / front-page.php)にてそのカテゴリの一覧を WP Query とか get_posts で表示してるんだけど、そこの並びを変えたいよーみたいな状況ではないかと思います。
自分が業務で使ってるテーマのうち、前任者が作っていたものを引き継いだ案件にもそういうふうに実装しているものが結構ありました。手法としては割と簡単にできますしね。
お客さんに説明したい場合にも、カテゴリの欄を見せて「トップページに表示」ってチェックボックスをONにすればトップに出ますよって言うだけなので楽ちんです。
自分が担当するようになってから作ってるテーマでも初期の頃はこの方法使ってました。ただ、この方法だとなんかのはずみでこのカテゴリの投稿そのものにアクセスした時にパンくずがちょっとあれな感じなので現在は別の方法(後述)を使うことが多いですが。
で、結局のところどうやって入れ替えるの?
さて、話がそれてしまいましたが、実際に入れ替える方法ですが、今思いつく限りで3種類の方法があります。結構強引なやり方も含まれますが。
方法1.日付を入れ替える
もっともシンプルかつ簡単な方法ですね。
そもそも投稿というのは、時間軸の影響を受けるタイプのポストのことを指します。なので、並び順もなにもしなければ「時間順」になります。ブログの記事とかは(先頭固定とかを除けば)日付順で並ぶのが一般的ですしね。
なので、トップページのコンテンツなど、時間軸の影響を受けることがない(或いは受けさせたくない)項目の場合、投稿が持つ時間のデータというのは、コンテンツのメタデータとしては不要な要素になります。
なので、日付を書き換えてしまうことで意図的に新しい記事または古い記事にしてしまうことで日付順ソート時の並びを制御しようというものです。
おすすめはトップページコンテンツを全部同じ日付にした上で「時」の値を並べたい順に指定、「分」は「00」とすることです。
こうすると、時の数値がそのまま表示の並び順にできます。ただ、間に割り込ませたいときにこのままだと全体的に時間をずらす必要がありますよね。
そこで割り込ませたい投稿には「分」を指定します。
イメージにするとこんな感じ。
ただし、この方法だと時間の流れも考慮しないといけないコンテンツ(新着の実績とかお知らせとか)には使えません。というかそういうコンテンツは意図的に並び替えないか。
方法2.カスタム投稿でやる
投稿と違い、固定ページは時間軸から外れた存在になります。この辺は初日に書いた気もしますね。
ですので、並べて表示したい場合のために(かどうかは知りませんが)、投稿の並び順を指定することができます。
ただし、通常固定ページはカテゴリーのように分類する手段がないので固定ページ一覧表示とかしたら多分全部出てくると思います。というかそもそも内容を表示しながら固定ページ一覧みたいなのってできるんかな…?試してないんでなんとも言えませんがあんまそういうの聞いたこと無いんでできないかもしれませんね。
そこで「固定ページタイプのカスタム投稿タイプ」を使用します。つまり、supports に page-attribute がはいってて、hierarchical が true になってる状態です。
で、トップページとかでは、WP Query とかで、type に作成したポストタイプを指定してあげれば多分内部で順序の数値を入れ替えることで並び替えができると思います。
これによって、順番も指定できるし他の固定ページにも影響を与えませんね。
ついでに管理画面内でドラッグアンドドロップで入れ替えられるようなUIとかつくると、さらに便利になるかもしれませんが、まぁそれは別になくてもいいかなと。
昔固定ページをドラッグアンドドロップで並び替えるようなプラグインがあったような気もしますが、今もあるのか、カスタム投稿でも使えるのか…そのへんは不明です。興味があれば調べてみてください。
3.カスタムフィールドでやる
「disp_order」とかなんかそんな感じで適当に新しいカスタムフィールドを作り、そこの数値で並び替える方法です。
カスタムフィールドは自力で実装してもいいし、デフォルトの使ってもいいし、プラグイン使っても構わないです。
一覧を生成する際は、orderby の値を meta_value_num にします。これは、カスタムフィールドの値を数値として扱うという指定です。
同時にどのカスタムフィールドを使用するかを指定してあげないと行けないので、meta_key の値に作成したカスタムフィールドのキーをセットすることも忘れずに。
まとめると、こんな感じでしょうか?(今回関係しそうなところだけ書いてますので足りない部分はいい感じに付け足して使ってください。
1 2 3 4 5 6 7 8 |
<?php $args = array( 'order' => 'DESC', 'orderby' => 'meta_value_num', 'meta_key' => 'disp_order', 'posts_per_page' => 5, ); $query = new WP_Query( $args ); |
ついでに管理画面内でドラッグアンドドロップで入れ替えられるようn(ry
で、結局どの方法がいいわけ?
どの方法も一長一短な感じがしますんで、まぁテーマの構造とか、運用方法にあわせて決めるのがいいんじゃないんでしょうかね?
これはWordPressひとりアドベント・カレンダー2015の記事です。
WPAC2015Soloについてはこちらをご覧ください。
コメントする