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” の投稿を最優先で表示し、それ以外の投稿が続きます。
よくある質問(FAQ)
Q. WP_Queryでカスタムフィールドの値を基にソートするには?
A. meta_key=’field_name’とorderby=’meta_value’(文字列)またはmeta_value_num(数値)を設定します。数値の場合は必ずmeta_value_numを使わないと1・10・2の順になります。
Q. 複数のカスタムフィールドを組み合わせたソートはできますか?
A. meta_queryで複数フィールドを設定し、orderby=array(‘meta1_clause’ => ‘ASC’, ‘meta2_clause’ => ‘DESC’)のようにmeta_query clauseキーを使って複数条件ソートができます(WordPress 4.2以降)。
Q. カスタムフィールドが存在しない記事はソート結果にどう影響しますか?
A. meta_key指定のソートではカスタムフィールドが存在する記事のみが取得されます。全記事を取得しつつソートしたい場合はmeta_queryのcompare=’EXISTS’か、LEFT JOINを使ったカスタムクエリが必要です。
まとめ
- meta_key と orderby を使えば単一のカスタムフィールドでソート可能
- meta_query を使えば複数のカスタムフィールドでソートできる
- meta_value_num を指定すれば数値データのソートが可能
- post_date と組み合わせれば、カスタムフィールドが同じ場合の並び順を制御可能
- post__in を使えば特定の値を優先的に表示できる
カスタムフィールドを活用したソートを設定することで、より柔軟な投稿の並び替えが可能になります。
