@its2easyy

Можно ли одновременно сортировать по наличию мета поля и числовому значению этого поля?

Есть фильтр цен, который собирает массив с meta_query
$meta_query = array();
	$meta_query['relation'] = 'AND';
	if ( $price_from) ) {
		$meta_query[] =  array(
			'key' => '_project_price',
			'value' => $price_from,
			'type' => 'DECIMAL',
			'compare' => '>='
		);
	}
	if ( !empty($price_to) ) {
		$meta_query[] =  array(
			'key' => '_project_price',
			'value' => $price_to,
			'type' => 'DECIMAL',
			'compare' => '<='
		);
	}

И работает сортировка через orderby => meta_value_num и meta_key => _project_price.
Всё работает, но у некоторых товаров в цене ничего не указано (или указан например 0), и нужно чтобы они при любой сортировке показывались в конце списка. Можно ли как то сделать чтобы сначала шла сортировка по наличию (или нулю) мета поля, а потом по числу в этом поле? (примерно так должно сортировать: ASC - 10, 17, 24, 0, 0; DESC - 24, 17, 10, 0, 0)
  • Вопрос задан
  • 202 просмотра
Пригласить эксперта
Ответы на вопрос 1
artzolin
@artzolin Куратор тега WordPress
php, WordPress разработка сайтов artzolin.ru
Попробуйте такой вариант

$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, чтобы при сохранении поста добавлялось пустое значение, если оно не указано
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы