WordPress как на ладони
wordpress jino

Параметры 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
Андрей 6 месяцев назад
  • 0
    Kama4697

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

    Далее, не уверен что такой запрос можно создать с помощью 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 6 месяцев назад

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

    $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 6 месяцев назад

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

    Kama 6 месяцев назад

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

    $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 6 месяцев назад

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

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