Удобный и Быстрый Хостинг для сайтов на 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
Андрей
9.1 год назад
  • 0
    Kama 9891

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

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

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

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

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

    Kama 9.1 год назад

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

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

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

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