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

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 でカスタムフィールドを含む複数の条件でソートを行う方法は、以下のステップが基本です。

  1. 単一ソート なら meta_key と orderby に meta_value or meta_value_num を設定。
  2. 複数ソート するなら、meta_query で対象キーを読み込み、orderby に配列で複数指定する。
  3. 管理画面など既存クエリ をカスタマイズしたい時は pre_get_posts を活用。

こうした設定を組み合わせることで、柔軟なソートを実現できます。並び順はユーザーの使い勝手や運用効率にも大きく影響するため、ぜひ自分のサイトの要件に合わせて最適なソートロジックを組んでみてください。