WordPress как на ладони
WordPress Meetup #4. Встречаемся в Москве 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
Андрей
год назад
  • 0
    Kama5407

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

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

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

    $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 год назад

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

    Kama год назад

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

    $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 год назад

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

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