WordPress で投稿一覧をカスタムフィールドの値でソートする方法

WordPress で投稿一覧をカスタムフィールドの値でソートして表示する方法を紹介します。
例えば、投稿をカスタムフィールドの値でソートしたい時に便利な方法です。

  1. 投稿一覧をカスタムフィールドの値でソートする
    1. ソートの条件を変更する
  2. カスタムフィールド値が日付の場合に日付でソートする方法
    1. カスタムフィールド値のデータ型を指定する
  3. リピーターフィールド値でソートする方法

投稿一覧をカスタムフィールドの値でソートする

投稿一覧をカスタムフィールドの値でソートする場合は meta_query を使用します。
例えば、カスタム投稿タイプが products、カスタムフィールド名が 商品 の場合、フィールド値が ラジオ の投稿を取得する方法を紹介します。

<?php // 投稿をカスタムフィールドの値でソートする
$custom_field_value = 'ラジオ'; // フィールド値の指定
$args = array(
'post_type' => 'products', // 投稿タイプを指定
'posts_per_page' => -1, // 表示件数を指定
'meta_query' => array( // カスタムフィールドを指定
array(
'key' => '商品', // フィールド名の指定
'value' => $custom_field_value, // 値の指定
'compare' => 'LIKE' // フィールド値の部分一致
)
)
);
$the_query = new WP_Query($args); if($the_query->have_posts()):
?>
<?php while ($the_query->have_posts()): $the_query->the_post(); ?>
<a href="<?php the_permalink(); ?>"><?php echo get_the_title(); ?></a>
<?php endwhile; ?>
<?php wp_reset_postdata(); ?>
<?php else: ?>
<!-- 投稿が無い場合の処理 -->
<?php endif; ?>

カスタムフィールド名を変更する場合は 'key' => ’商品’,商品 を任意の値に変更。
カスタムフィールド値を変更する場合は $custom_field_value = 'ラジオ’;ラジオ の値を変更してください。

ソートの条件を変更する

ソートの条件を変更する場合は 'compare' => 'LIKE'LIKE を変更します。
変更できる compare の値は次の通りです。

=
値と一致する
!=
値と一致しない
>
値より大きい
>=
値以上
<
値より小さい
<=
値以下
LIKE
値で指定した文字列に一致する
NOT LIKE
値で指定した文字列に一致しない
IN
値(配列)で指定したいずれかに一致する
NOT IN
値(配列)で指定したいずれにも一致しない
BETWEEN
2つの値で指定した範囲内(境界を含む)
NOT BETWEEN
2つの値で指定した範囲外

カスタムフィールド値が日付の場合に日付でソートする方法

カスタムフィールド値が日付の場合に、その日付の順番でソートする方法を紹介します。
例えば、カスタム投稿タイプが event、カスタムフィールド名が 開催日 の場合に、各投稿のカスタムフィールド値の日付の順番でソートして表示します。

  $args = array( // クエリの作成
'post_type' => 'event', // 投稿タイプの指定
'orderby' => 'meta_value_num', // カスタムフィールド値が数値の場合 meta_value_num を指定
'posts_per_page' => -1, // すべての投稿を表示
'meta_query' => array( // カスタムフィールドの指定
array(
'key' => '開催日', // フィールド名の指定
'type'=>'DATE' // カスタムフィールドの値が日付であることを宣言
)
)
);

数値の桁数が違う場合は意図した順番にならない場合があります。
ソートする値は同じ桁数や書式で用意するようにしてください。

カスタムフィールド値のデータ型を指定する

カスタムフィールドの値は文字列や数値、日付など色々あるので type にデータの型を指定してあげます。
型の種類は次の通りです。

‘CHAR’
カスタムフィールド値が文字
‘NUMERIC’
カスタムフィールド値が’SIGNED’の別名
‘DECIMAL’
カスタムフィールド値が浮動小数点数
‘SIGNED’
カスタムフィールド値が整数(符号あり)
‘UNSIGNED’
カスタムフィールド値が整数(符号なし)
‘DATE’
カスタムフィールド値が日付
‘DATETIME’
カスタムフィールド値が日時
‘TIME’
カスタムフィールド値が時刻
‘BINARY’
カスタムフィールド値がバイナリー

リピーターフィールド値でソートする方法

ACFのリピーターフィールド値でソートする場合は、$key の値に「フィールド名(リピーターフィールド)」と「サブフィールド名」を記載します。その際、フィールド名の区切りに対象の配列「_0_」を指定します。

$args = array( // クエリの作成
'post_type' => 'event', // 投稿タイプの指定
'posts_per_page' => -1, // すべての投稿を表示
'meta_query' => array( // カスタムフィールドの指定
array(
'key' => 'フィールド名_0_サブフィールド名', // フィールド名の指定
'value' => $value, // 値の指定
)
)
);

紹介したコードでは「フィールド名_0_サブフィールド名」とすることで、リピーターフィールドの最初(一番目)の配列にあるサブフィールド名を対象にします。二番目、三番目の値を参照するには次のように記載します。

$args = array( // クエリの作成
'post_type' => 'event', // 投稿タイプの指定
'posts_per_page' => -1, // すべての投稿を表示
'meta_query' => array( // カスタムフィールドの指定
'relation' => 'OR', // OR検索(デフォルトはAND)
array(
'key' => 'イベントセット_0_イベント', // 一番目の配列
'value' => $value // 値の指定
),
array(
'key' => 'イベントセット_1_イベント', // 二番目の配列
'value' => $value // 値の指定
),
array(
'key' => 'イベントセット_2_イベント', // 三番目の配列
'value' => $value // 値の指定
)
)
);

relation の指定は表示内容に合わせて変更してください。
参照する値が日付の場合は、前項の「カスタムフィールド値が日付の場合に日付でソートする方法」を参考に type を指定してください。

まとめ

WordPress で投稿一覧をカスタムフィールドの値でソートして表示する方法を紹介した。
その他、投稿の詳しい取得方法はWordPress 基本的なループの表示方法を紹介をご覧ください。