WordPress で投稿やカスタム投稿タイプを並べ替えるとき、デフォルトでは「日付」「タイトル」「ランダム順」などが一般的です。しかし、カスタムフィールド(メタ情報)を含めた複数の条件でソートしたい場合もあります。たとえば「独自の数値や順位をもとに昇順で並べ、そのあとに投稿日を降順に並べる」など、より柔軟な並び替えが必要なシーンもあるはずです。
本記事では、WordPress でカスタムフィールドを使った複数の条件によるソート方法について解説します。
カスタムフィールドを使った複数ソートが必要なシーン
独自の並び順をつけたい時
管理画面やフロントエンドで、独自の優先度や数値をカスタムフィールドに保存し、その値を元に並べ替えたいケース。
複数のメタ情報と標準のタイトルや日付を組み合わせたい時
例:優先度(昇順)→ タイトル(昇順) → 日付(降順)というように、複雑な条件で並べ替える要望があるケース。
「標準のソートではできない柔軟な条件付けをしたい」── そんな時に、カスタムフィールドでの複数ソートが役立ちます。
基本のソート構文:WP_Query での orderby 配列指定
WordPress 4.0 以降は orderby に配列を設定できるので、下記のように複数の条件を連続して指定できます。カスタムフィールド(数値扱い)をまず昇順に並べ、そのあとに日付を降順で並べる例です。
$args = [
'post_type' => 'post',
'posts_per_page' => -1,
'meta_key' => 'my_custom_key',
'orderby' => [
'meta_value_num' => 'ASC',
'date' => 'DESC',
],
];
$query = new WP_Query( $args );
- meta_key でソートしたいキー名を指定し、数値の場合は meta_value_num、文字列の場合は meta_value を使い分ける。
- orderby は配列で渡すことで、第一優先→第二優先といった複数条件ソートが可能になる。
カスタムフィールドが複数ある場合
複数のカスタムフィールドを使いたい場合は、次のように meta_query でキーを指定し、それぞれをソート条件に含める必要があります。
$args = [
'post_type' => 'post',
'posts_per_page' => -1,
'meta_query' => [
'relation' => 'AND',
[
'key' => 'custom_field_a',
'type' => 'NUMERIC',
'compare' => 'EXISTS',
],
[
'key' => 'custom_field_b',
'type' => 'NUMERIC',
'compare' => 'EXISTS',
],
],
'orderby' => [
'custom_field_a' => 'ASC', // 第一優先
'custom_field_b' => 'DESC', // 第二優先
],
];
$query = new WP_Query( $args );
- type をしっかり指定しないと、正しい並び替えが期待できない場合がある(数字が文字列ソートされるなど)。
- relation を AND にすることで、両方のフィールドが存在する投稿だけに限定できる。
テキストフィールドと数値フィールドを混在させたい場合
異なるタイプのカスタムフィールドを使う場合も、基本は同様です。たとえば「テキスト(文字列)をアルファベット順に並べた上で、数値フィールドを昇順に並べる」なら、下記のように設定します。
$args = [
'post_type' => 'post',
'posts_per_page' => -1,
'meta_query' => [
'relation' => 'AND',
[
'key' => 'custom_text',
'compare' => 'EXISTS',
'type' => 'CHAR', // 文字列として扱う
],
[
'key' => 'custom_number',
'compare' => 'EXISTS',
'type' => 'NUMERIC' // 数値として扱う
],
],
'orderby' => [
'custom_text' => 'ASC',
'custom_number' => 'ASC',
],
];
$query = new WP_Query( $args );
pre_get_posts フィルタを使って管理画面やアーカイブをカスタマイズ
pre_get_posts フィルタを使うと、管理画面やアーカイブページなど既存のクエリに対してソート条件を変更できます。たとえば、管理画面で特定の投稿タイプだけカスタムフィールドを優先してソートしたい場合は下記のように書きます。
function my_admin_sort_posts_by_custom_field( $query ) {
if ( is_admin() && $query->is_main_query() ) {
if ( 'my_post_type' === $query->get( 'post_type' ) ) {
// カスタムフィールド優先
$query->set( 'meta_key', 'order_key' );
$query->set( 'orderby', [
'meta_value_num' => 'ASC',
'title' => 'ASC',
] );
}
}
}
add_action( 'pre_get_posts', 'my_admin_sort_posts_by_custom_field' );
管理画面での絞り込みやカスタム投稿タイプの一覧画面など、既存の画面を柔軟にカスタマイズしたい時に便利です。
複雑なソートを成功させるポイント
meta_query と type の指定を忘れない
特に複数のカスタムフィールドを扱う場合は、meta_query の指定でデータベースに読み込むようにしておく必要があります。また、文字列なら CHAR、数値なら NUMERIC と適切に指定することが重要です。
パフォーマンスを考慮する
meta_query の数が増えると JOIN が増え、クエリが複雑になります。多量の投稿を扱うサイトではパフォーマンスに影響が出る場合があるため、専用のテーブルを用意するなどの検討が必要です。
まとめ
WordPress でカスタムフィールドを含む複数の条件でソートを行う方法は、以下のステップが基本です。
- 単一ソート なら meta_key と orderby に meta_value or meta_value_num を設定。
- 複数ソート するなら、meta_query で対象キーを読み込み、orderby に配列で複数指定する。
- 管理画面など既存クエリ をカスタマイズしたい時は pre_get_posts を活用。
こうした設定を組み合わせることで、柔軟なソートを実現できます。並び順はユーザーの使い勝手や運用効率にも大きく影響するため、ぜひ自分のサイトの要件に合わせて最適なソートロジックを組んでみてください。