【WordPress】WP_Queryでカスタムフィールドを複数条件でソートする方法

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 を使えば特定の値を優先的に表示できる

カスタムフィールドを活用したソートを設定することで、より柔軟な投稿の並び替えが可能になります。