Сортировка продуктов по мета полю которого нет
В каталоге необходимо отсортировать записи по мета полю 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' );
Но этот код выводит все товары, но я не могу их отсортировать. Подскажите как решить эту проблему, или в какую сторону копать.
Если в базе присвоить всем товаром мета поле, то все будет работать как надо, но товаров огромное количество, и не хочется лишних строк.
Заранее спасибо.
Именно так отсортировать стандартным способом (через WP_Query) не получится (уверен на 90%). Тут проблема в том, что при таком запросе в результате получается две колонки popularity, а для правильной сортировки нужна одна колонка!
Чтобы такое реализовать тебе нужно внедриться в сам SQL запрос и изменить его: получить разом все нужные метаполя и потом в ORDER указать одно поле popularity. Код не подскажу к сожалению, под руками нет, а разбираться времени нет, там не все так просто в этом случае...
Возможно тебе проще будет придумать обходной путь какой-то. Например отсортировать поля имеющие popularity, и в конце добавить поля не имеющие это поле (ну или наоборот, если нужна обратная сортировка DESC).
Спасибо за ответ! Буду пробовать)