【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” の投稿を最優先で表示し、それ以外の投稿が続きます。

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

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