WordPress как на ладони
Недорогой хостинг для сайтов на WordPress: wordpress.jino.ru Шаблоны сайтов на русском

Параметры meta_query. Сортировка по двум произвольным полям, одно из которых может быть не заполнено. Как сделать?

Есть продукт (custom post type - 'products') и у него есть два произвольных поля "price" и "special_price".

Есть товары у которых заполнены оба поля, а есть такое, у которых только поле "price" (т.е. поле "special_price" НЕ задано, не заполнено).

Задача -> фильтр продуктов по убыванию цены.
Проблема -> как в meta_query учитывать оба поля, с учетом того, что "special_price" не у всех товаров заполнено?

Т.е. нужно в параметрах meta_query создать условие:
Сортировать по умолчанию по полю "special_price", но если "special_price" не заполнено - смотреть значение поля "price" и учитывать его значение в сортировке по убыванию цены.

Пробую так, но не работает:

$args = array(
  'post_type' => 'custom_products', ,
  'relation' => 'OR',
  'meta_query' => array(
	array(
	  'key' => 'price'
	),
	array(
	  'key' => 'special_price'
	),
  ),
  'orderby' => 'meta_value_num',
  'type' => 'NUMERIC',
  'order' => 'DESC',
);

Помогите пожалуйста разобраться. Спасибо!

0
Андрей
1.7 года назад
  • 0
    Kama7364

    Для начала, ты вообще неправильно указываешь параметры запроса...

    Далее, не уверен что такой запрос можно создать с помощью WP_Query, но вроде это возможно. Попробуй такой вариант:

    $args = array(
      'post_type' => 'custom_products',
    
      'meta_query' => array(
    	'relation' => 'OR',
    	'price' => array(
    	  'key'     => 'price',
    	  'type'    => 'NUMERIC',
    	  'compare' => 'EXISTS',
    	),
    	'sprice' => array(
    	  'key'     => 'special_price'
    	  'type'    => 'NUMERIC',
    	  'compare' => 'EXISTS',
    	),
      ),
    
      'orderby' => array( 'sprice'=>'DESC', 'price'=>'DESC' ),
    );

    Но тут он сначала отсортирует по sprice, а у которых нет sprice отсортирует по price. Это не совсем то что тебе нужно, кажется... Однако лучше чем ничего...

    AndWP 1.7 года назад

    Спасибо, уважаемый!)
    Верно, логика была немного иная, но так тоже годится, иначе, видимо, вообще никак.
    Надо сказать сортирует довольно долго.
    Для полноты картины полностью параметры выглядят так:

    $args = array(
    	'post_type' => 'custom_products',
    	'meta_query' => array(
    		'relation' => 'OR',
    		'price' => array(
    			'key'     => 'price',
    			'type'    => 'NUMERIC',
    			'compare' => 'EXISTS',
    		),
    		'sprice' => array(
    			'key'     => 'special_price',
    			'type'    => 'NUMERIC',
    			'compare' => 'EXISTS',
    		),
    	),
    	'orderby' => array( 'sprice'=>'DESC', 'price'=>'DESC' ),
    	'tax_query' => array(
    		array(
    			'taxonomy' => 'catalog',
    			'field'    => 'slug',
    			'terms'    => $reqterm
    		)
    	)
    );

    Еще раз, огромное спасибо!

    Kama 1.7 года назад

    Кэшируй результат если возможно - это аццкий запрос, если данных много...

    Kama 1.7 года назад

    Я тут прикинул, вот такой запрос по идее может сработать и именно так как тебе нужно... Проверь ка.

    $args = array(
    	'post_type' => 'custom_products',
    
    	'meta_query' => array(
    		'price_sort' = array(
    			'relation' => 'OR',
    			array(
    				'key'     => 'special_price'
    				'type'    => 'NUMERIC',
    				'compare' => 'EXISTS',
    			),
    			array(
    				'key'     => 'price',
    				'type'    => 'NUMERIC',
    				'compare' => 'EXISTS',
    			),
    		),
    	),
    
    	'orderby' => 'price_sort',
    	'order' => 'DESC',
    );
    Комментировать
  • 1

    Незнаю насколько правильно.... Если создать третье поле в которое автоматом будет писаться минимальное значение и уже по нему делать запрос

    Kama 1.7 года назад

    Да, пожалуй это выход в данном случае...

    Комментировать
На вопросы могут отвечать только зарегистрированные пользователи. Вход . Регистрация