WordPressのWP_Queryを利用すると、カスタムフィールドの値を基準に投稿の並び順を自由にカスタマイズできます。本記事では、カスタムフィールドを複数の条件でソートする方法について解説します。
WP_Query でカスタムフィールドを使ってソートする基本
カスタムフィールドを基準にソートする場合、meta_key と orderby を指定することで並び替えが可能です。
$args = array(
'post_type' => 'post',
'posts_per_page' => 10,
'meta_key' => 'custom_field_name', // カスタムフィールドのキー
'orderby' => 'meta_value', // 文字列の場合
'order' => 'ASC', // 昇順
);
$query = new WP_Query($args);
この方法では、custom_field_name の値に基づいて投稿を並び替えることができます。
複数のカスタムフィールドで並び替える方法
複数のカスタムフィールドを基準に並び替えたい場合は、meta_query を使い orderby に複数の条件を指定します。
$args = array(
'post_type' => 'post',
'posts_per_page' => 10,
'meta_query' => array(
'relation' => 'AND',
'field_a' => array(
'key' => 'custom_field_a',
'compare' => 'EXISTS',
),
'field_b' => array(
'key' => 'custom_field_b',
'compare' => 'EXISTS',
),
),
'orderby' => array(
'field_a' => 'ASC', // カスタムフィールドAで昇順
'field_b' => 'DESC', // カスタムフィールドBで降順
),
);
$query = new WP_Query($args);
このコードでは、まず custom_field_a を昇順で並べ、同じ値の場合は custom_field_b を降順でソートします。
数値データのソート
カスタムフィールドの値が数値の場合は、meta_value_num を使うと適切な順番に並び替えられます。
$args = array(
'post_type' => 'post',
'posts_per_page' => 10,
'meta_query' => array(
'field_a' => array(
'key' => 'custom_field_a',
'type' => 'NUMERIC',
'compare' => 'EXISTS',
),
),
'orderby' => array(
'field_a' => 'ASC',
),
);
$query = new WP_Query($args);
この場合、カスタムフィールドの値が数値として適切に並び替えられます。
カスタムフィールドと投稿日を組み合わせてソート
カスタムフィールドの値が同じ場合に、投稿の投稿日(post_date)で並び替えることも可能です。
$args = array(
'post_type' => 'post',
'posts_per_page' => 10,
'meta_key' => 'custom_field_a',
'orderby' => array(
'meta_value' => 'ASC', // カスタムフィールドの昇順
'date' => 'DESC', // 投稿日で降順
),
);
$query = new WP_Query($args);
これにより、custom_field_a の値で昇順に並び、同じ値の投稿は post_date で新しい順に並びます。
特定の値を優先するカスタムソート
特定の値を持つ投稿を優先表示したい場合は、post__in を使う方法があります。
$important_posts = new WP_Query(array(
'post_type' => 'post',
'posts_per_page' => -1,
'meta_key' => 'custom_field_a',
'meta_value' => 'important',
'fields' => 'ids',
));
$important_ids = $important_posts->posts;
$args = array(
'post_type' => 'post',
'posts_per_page' => 10,
'orderby' => 'post__in',
'post__in' => array_merge($important_ids, array()),
);
$query = new WP_Query($args);
この方法では、custom_field_a の値が “important” の投稿を最優先で表示し、それ以外の投稿が続きます。
まとめ
- meta_key と orderby を使えば単一のカスタムフィールドでソート可能
- meta_query を使えば複数のカスタムフィールドでソートできる
- meta_value_num を指定すれば数値データのソートが可能
- post_date と組み合わせれば、カスタムフィールドが同じ場合の並び順を制御可能
- post__in を使えば特定の値を優先的に表示できる
カスタムフィールドを活用したソートを設定することで、より柔軟な投稿の並び替えが可能になります。