試してみたところ、下記のコードで意図通り取得することができました。
PHP
1<?php
2$args = [
3 'cat' => 4,
4 'posts_per_page' => 5,
5 'orderby' => 'meta_value',
6 'order' => 'ASC',
7 'meta_query' => [
8 'relation' => 'OR',
9 [ /* priceが存在する場合 */
10 'key' => 'price',
11 'compare' => 'EXISTS',
12 ],
13 [ /* priceが存在しない場合 */
14 'key' => 'price',
15 'compare' => 'NOT EXISTS',
16 ],
17 ],
18];
19$q = new WP_Query( $args );
meta_query の条件は、指定順で取得できることが判明しました。
上記のコードだと、メタキー(price)未指定のものが最終ページ末尾に表示されますが、
/*priceが存在しない場合*/
の方を前に持ってくると、メタキー未指定のものが1ページ目先頭に表示されました。
ご提示いただいた、valueが空の場合を指定する方法
PHP
1 'meta_query' => array(
2 array(
3 'key' => 'price',
4 'value' => '',
5 'compare' => '=' // 空の場合
6 )
7 )
だと、うまく判定できませんでした。
DBを見た所、そもそもメタキーが入っていない状態だったため、NOT_EXISTS
を指定する必要がありました。
(一度値を登録後、空にして登録し直しても、meta_keyが削除される)
とはいえ、この書き方から大きなヒントを得られました。本当にありがとうございました!
また、今回は採用しませんでしたが、極大の値を指定する方法も
有用なやり方だと思いますので、今後の参考とさせていただきます。
重ねてありがとうございました!
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。