WordPressの記事一覧ページは、標準だと公開日時の新しいものから順に表示されます。
しかし、場合によっては古いものから逆順に表示させたい時や、公開日時に関係なく任意の順序で表示させたい時もあると思います。
例えば僕の場合、最近「カリキュラム式の会員サイト」を作る機会があったのですが、カリキュラム式だと記事を読んでほしい順番が決まっているので、1、2、3、・・と順に表示させたいし、後から記事を追加した時にも新しい記事をカリキュラムの任意の順番(途中とか)に差し込んだりしたいな、と。
(こんな感じ)
そこで今回は、プラグインやカスタムフィールドを活用して任意の順番で設定可能にする方法をご紹介します。
目次
「カスタムフィールド」で順序を制御する
カスタムフィールドは、記事データに独自の項目を追加する機能です。
今回は「記事表示順(数値)」という項目を新たに追加し各記事にて設定可能にすることで、記事一覧ページで「記事表示順(数値)」の順番で記事が表示されるようにしてみます。
2つの方法をご紹介しますが、どちらも内部的には「表示順序用のカスタムフィールド」を追加することで対応している形になります。
方法1: プラグイン「Post Types Order」を使う
そのものズバリなプラグイン、「Post Types Order」を使うのが、一番手っ取り早いです。
インストールして有効化すると、管理画面の「投稿」メニュー内に「並び替え」という項目が追加され、クリックすると以下のように記事タイトル一覧が表示されます。
各記事タイトルをドラッグ&ドロップで順序変更すれば、一覧ページでの表示順序も変更されます。操作性も良く、使いやすいです。
(内部的には「menu_order」という名前のカスタムフィールドを追加しているようです)
方法2: functions.phpなどに直接記述
場合によっては、余計なプラグインを入れたくない・・という事もあると思います。
すでに何らかのカスタムフィールド管理用プラグインを導入済みで、表示する場所ごとに細かく制御したい場合などは、独自にカスタムフィールドを追加して、functions.phpやテーマファイル内で表示順を制御した方が良いかも。
1. カスタムフィールドを管理するWordPressプラグインの導入
記事投稿ページでカスタムフィールドを設定できるプラグインはいくつかありますが、「Advanced Custom Fields」が細かく設定しやすくてオススメです。
下のように各項目を設定することで、各記事でカスタムフィールドの設定が可能となります。
設定すると、各記事の入力エリア下に以下のようなカスタムフィールド入力項目が表示されます。各記事の表示させたい順番ごとに数値を割り当てましょう。
2. functions.phpへの記述
上で設定した「フィールド名」がカスタムフィールド名になるので、この値を元に並び替え用の処理を記述することで、自由に表示順序を制御できるようになります。
例えば『カテゴリー一覧』のページのみ、カスタムフィールド「順序」の値順で表示させたい場合は、以下のように記述します。
function test_pre_get_posts($query) { if ( is_admin() || ! $query->is_main_query() ) { return; } if ( $query->is_category() ) { $query->set( 'meta_key', 'post_order' ); $query->set( 'orderby', 'meta_value_num' ); $query->set( 'order', 'ASC' ); } } add_action( 'pre_get_posts', 'test_pre_get_posts' );
meta_key
が、順序の対象となる値。Advanced Custom Fieldsの設定で言えば「フィールド名」になります。
order_by
は、何を基準に並び変えるか。order
で、昇順(ASC)か降順(DESC)かを指定します。order_by
のmeta_value_num
は、「値を数値と扱って順序変更する」という意味です。
ここをmeta_value
にしてしまうと、「値を文字列と扱って順序変更する」という意味になってしまい、挙動が変わってしまうのでご注意を。(例えば各記事に「1,2,3,・・,9,10,11」と設定した時、meta_value
だと「1、10,11,2,3,・・,9」の順に表示されてしまいます)
まとめ
記事の表示順を自由に設定する方法について、2つご紹介しました。
その2の方が何かと応用も効きますが、「後からカリキュラムの途中に記事を差し込みたい」といった場合はやや面倒です。(差し込んだ記事以降のカスタムフィールド値を変更しなくちゃいけないので)
状況に応じて、色々使い分けてみてください。