Попробуйте такой вариант
$myQuery = new WP_Query( [
'meta_query' => [
'relation' => 'OR',
'price_exists' => [
'relation' => 'AND',
[
'key' => '_project_price',
'value' => $price_from,
'type' => 'DECIMAL',
'compare' => '>='
],
[
'key' => '_project_price',
'value' => $price_to,
'type' => 'DECIMAL',
'compare' => '<='
],
],
'price_empty' => [
'key' => '_project_price',
'compare' => 'EXIST',
],
],
'orderby' => [
'price_exists' => 'ASC',
'price_empty' => 'DESC',
],
] );
Пишу без тестов, может не работать. Но я бы вообще получал два ключа, первый с
BETWEEN
найдет все ключи с заданным диапазоном между $price_from и $price_to, а второй
NOT BETWEEN
- которые в диапазон не входят
Скорее всего вам нужно будет создать для постов хотя бы пустые поля, где их нет. Это можно сделать следующим образом:
$myPosts = get_posts( array(
'numberposts' => -1,
'post_type' => 'product',
) );
foreach ( $myPosts as $key => $myPost ) {
// проверяем, что поля не существует
if ( get_post_meta( $myPost->ID, '_project_price', true ) == false ) {
update_post_meta( $myPost->ID, '_project_price', '' ); // пишем в него пустое значение
}
}
Или можете адаптировать этот кусок кода для хука
save_post
, чтобы при сохранении поста добавлялось пустое значение, если оно не указано