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

Параметры 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.7 лет назад
  • 0
    Kama9601

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

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

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

    Kama 6.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 6.7 лет назад

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

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