• Вопрос без рабочей ссылки на проблему считается риторическим. Без ссылки и скриншота - провокацией!
  • Темы озаглавленные с маленькой буквы или капсом удаляются без предупреждения!

Сортировка товаров по двум параметрам, включая кастомные meta

rudolfl

Новичок
Всем доброго дня.

Что я пытаюсь сделать:
1. Я хочу чтоб в каждой категории вначале показывались те товары которые я отмечу. Потом все остальные. И отмеченные товары и остальные должны быть рассортированы по цене.
2. Как я это пытаюсь сделать:

Я создал кастомный мета для товара и назвал его "hfo_featured".

Потом делаю так:
PHP:
function rl_product_query_by($q)
{       
        if (!$q->is_main_query())
                return;
        
        $meta_query = array(
                'relation' => 'OR',
                'hfo_clause' =>array (
                        'key' => 'hfo_featured',
                        'type' => 'UNSIGNED',
                        'compare' => 'EXISTS'
                ),
                'price_clause' =>array (
                        'key' => '_price',
                        'type' => 'UNSIGNED',
                        'compare' => 'EXISTS'
                )
        );
        
        $q->set('meta_query',$meta_query);
        $q->set('orderby', array(
                                'hfo_clause' => 'DESC',
                                'price_clause' => 'DESC'
                        ));
}
add_action( 'pre_get_posts', 'rl_product_query_by' );

Результат -- помеченны товары появлятся сверху, но сортировка по цене не происходит.
Вторая проблема -- MySQL запрос медленный.

Вот, кстати, и сам запрос:
SQL:
SELECT SQL_CALC_FOUND_ROWS wp_posts.ID
FROM wp_posts
LEFT JOIN wp_term_relationships
ON (wp_posts.ID = wp_term_relationships.object_id)
INNER JOIN wp_postmeta
ON ( wp_posts.ID = wp_postmeta.post_id )
INNER JOIN wp_postmeta AS mt1
ON ( wp_posts.ID = mt1.post_id )
WHERE 1=1
AND ( wp_posts.ID NOT IN (
SELECT object_id
FROM wp_term_relationships
WHERE term_taxonomy_id IN (10) )
AND wp_term_relationships.term_taxonomy_id IN (901) )
AND ( wp_postmeta.meta_key = 'hfo_featured'
OR mt1.meta_key = '_price' )
AND wp_posts.post_type = 'product'
AND (wp_posts.post_status = 'publish'
OR wp_posts.post_status = 'acf-disabled'
OR wp_posts.post_status = 'private')
GROUP BY wp_posts.ID
ORDER BY CAST(wp_postmeta.meta_value AS UNSIGNED) DESC, CAST(mt1.meta_value AS UNSIGNED) DESC
LIMIT 0, 32

Вопрос такой -- на правильном ли я, вообще, пути и как сделать правильно.

Есть вариант -- модифицировать темплейт страницы категории и делать два запроса -- один с "hfo_featured"=1, другой с "hfo_featured" = 0 . Но мне кажется, это не очень правильно.

Спасибо
Rudolf
 

rudolfl

Новичок
Пошёл таки путём модификации темплейта магазина. Всего несколько строк изменений и всё работает резвенько и без танцев с бубнами
 
Сверху Снизу