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

Сортировка продуктов по мета полю которого нет

В каталоге необходимо отсортировать записи по мета полю popularity, который есть только у просмотренных товаров.

Нужно, что бы были сперва сортировались товары по meta_value, потом товары у которых нет этого мета поля.

function popularity_sorting( $q ) {
	if (is_shop() || is_product_category()) {
		$meta_query = array (
			'relation' => 'OR',
			'exists_clause' => array (
				'key'       => 'popularity',
				'compare'   => 'EXISTS',
			),
			'not_exists_clause' => array (
				'key'       => 'popularity',
				'compare'   => 'NOT EXISTS',
			)
		);
		$q->set( 'meta_query', $meta_query);

		$q->set( 'orderby', 'exists_clause');
		$q->set( 'order', 'DESC');
	}
}
add_action( 'woocommerce_product_query', 'popularity_sorting' );

Но этот код выводит все товары, но я не могу их отсортировать. Подскажите как решить эту проблему, или в какую сторону копать.

Если в базе присвоить всем товаром мета поле, то все будет работать как надо, но товаров огромное количество, и не хочется лишних строк.

Заранее спасибо.

0
Alexander
5.4 года назад
  • 0
    Kama9619

    Именно так отсортировать стандартным способом (через WP_Query) не получится (уверен на 90%). Тут проблема в том, что при таком запросе в результате получается две колонки popularity, а для правильной сортировки нужна одна колонка!

    Чтобы такое реализовать тебе нужно внедриться в сам SQL запрос и изменить его: получить разом все нужные метаполя и потом в ORDER указать одно поле popularity. Код не подскажу к сожалению, под руками нет, а разбираться времени нет, там не все так просто в этом случае...

    Возможно тебе проще будет придумать обходной путь какой-то. Например отсортировать поля имеющие popularity, и в конце добавить поля не имеющие это поле (ну или наоборот, если нужна обратная сортировка DESC).

    kokovkin-alex 5.4 года назад

    Спасибо за ответ! Буду пробовать)

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