カスタム投稿タイプをカスタムフィールドの値で並び替えさせるサブループ
とあるクライアントさんからカスタム投稿タイプを特殊な順番で並び替えたいと言われました。そこで、カスタムフィールドに値を入れてそれを並び替えの基準にしようというのが今回の趣旨です。
下記がそのときに作ったコードです。
PHP
<?php $custom_posts = get_posts(array( 'post_type' => 'カスタム投稿タイプスラッグ', // 投稿タイプ 'posts_per_page' => 6, // 表示件数 'meta_key' => 'カスタムフィールドのキー', //並び替えに利用したいカスタムフィールドのキーを指定 'orderby' => 'meta_value', //カスタムフィールドの値で並び替え 'order' => 'ASC' // 昇順・降順 ) )); global $post; if($custom_posts): foreach($custom_posts as $post): setup_postdata($post); ?> <!-- ループはじめ --> <h3><a href="<?php the_permalink() ?>"><?php the_title(); ?></a></h3> <p><?php the_time('Y/m/d') ?></p> <p><?php the_excerpt(); ?></p> <!-- ループおわり --> <?php endforeach; wp_reset_postdata(); endif; ?>
具体的なループの吐き出しの部分は各々で作ってくださいね。
コードの解説
コードの解説です。下記のコードの行をクリックするとその行の説明が開きますので、お好きな行をクリックしてみてください。
- <?php
- $custom_posts = get_posts(array(
-
get_posts()
は、投稿の一覧を表示させるときに使うお決まりの関数で、取得したい記事の設定を行います。全体の骨組みは下記のようになります。PHP
<?php $custom_posts = get_posts(array( // 取得する投稿の設定 )); global $post; if($custom_posts): foreach($custom_posts as $post): setup_postdata($post); ?> // ループで設定した投稿データを出力 <?php endforeach; endif; wp_reset_postdata(); ?>
「取得する投稿の設定」のところで取得したい投稿の設定を行い、それを「ループで設定した投稿データを出力」のところで出力します。上記の骨組みは公式のようなものなので覚えてしまっても良いかもしれません。
ここでは、取得したい記事の設定を変数
$custom_posts
に代入しています。 - ‘post_type’ => ‘カスタム投稿タイプスラッグ’, // 投稿タイプ
- 投稿タイプの指定を行っています。ここにカスタム投稿タイプのスラッグを入れます。
- ‘posts_per_page’ => 6, // 表示件数
-
'posts_per_page' => 6,
は記事の表示件数の指定です。数字を指定する場合は、値のところにクオーテーションマーク「’」をつけて「’6’」とする必要はありません。
ちなみに、記事を全件表示したいときは「-1」と指定します。 - ‘meta_key’ => ‘カスタムフィールドのキー’, //並び替えに利用したいカスタムフィールドのキーを指定
-
カスタムフィールドのキーを指定しています。
これをこの後、記事の並べ替えの基準に指定します。 - ‘orderby’ => ‘meta_value’, // 表示順の基準
-
データをある特定の規則に従って並べ替えることを「ソートする」というのですが、
orderby
では、記事をどんな項目に沿ってソートさせるかを決めます。ここでは、meta_key
を指定し、カスタムフィールドのキーに沿って並び替えを行っています。他にも代表的な項目として下記があります。
順序づけパラメータ 意味 date 投稿日 modified 更新日 name スラッグ rand ランダム ID 投稿ID(大文字です) title タイトル - ‘order’ => ‘ASC’ // 昇順・降順
-
order
では、orderby
で指定した項目を昇順(ACB順)で並べるのか、降順(ACB順の反対)で並べるのかを指定できます。ASC: 昇順
DESC: 降順ちなみに初期値は、
'DESC'
になっていますので、デフォルトで良い場合はわざわざ指定せずにまるごと行を削除してしまってもかまいません。 - ));
- global $post;
-
global $post;
は、グローバル宣言と言われるものです。$post
は、現在の投稿に関する情報が詰まった変数でWordPress全体で使用されています。そのため、これを使用する際は前もって宣言が必要になります。テンプレート内で使用する文には宣言は必要がないみたいですが、一応、どこで使用してもトラブルがないよう宣言を入れてあります。
- if($custom_posts): foreach($custom_posts as $post): setup_postdata($post); ?>
-
if(条件): 真の場合の処理;
という形でif文になっていますので、カッコの中の変数
$custom_posts
の中身が空でない場合は「真」とて扱われます。つまり、次のforeach...
が実行されるということです。foreach($custom_posts as $post):
は、foreach文といって、foreach(配列変数 as 変数):
という仕組みになっています。「配列変数」のところに入っている記事の配列(記事のまとまり)が
$post
という変数として1つずつ取り出されます。さらに、
setup_postdata($post);
のところでは、それぞれの記事をページで表示できるように整えて(セットして)います。 - <!– ループはじめ –>
- <h3><a href=”<?php the_permalink() ?>”><?php the_title(); ?></a></h3>
- <p><?php the_time(‘Y/m/d’) ?></p>
- <p><?php the_excerpt(); ?></p>
- <!– ループおわり –>
- <?php endforeach; endif; wp_reset_postdata(); ?>
-
foreach文の終了、if文の終了と
setup_postdata($post);
のところで変更してしまった$post
の投稿に関する情報をリセットしています。
今回のポイントは下記の3つです。
'meta_key' => 'カスタムフィールドのキー',
上記の部分で、カスタムフィールドのキーを指定しています。
'orderby' => 'meta_value',
キーを指定した上で、それが投稿の表示順を決める基準になりますという意味です。
'order' => 'ASC'
ASC
を指定すると昇順、DESC
を指定すると降順になります。
以上が、カスタム投稿タイプをカスタムフィールドの値で並び替えさせるサブループの作り方でした。