
Всем доброго дня.
Что я пытаюсь сделать:
1. Я хочу чтоб в каждой категории вначале показывались те товары которые я отмечу. Потом все остальные. И отмеченные товары и остальные должны быть рассортированы по цене.
2. Как я это пытаюсь сделать:
Я создал кастомный мета для товара и назвал его "hfo_featured".
Потом делаю так:
Результат -- помеченны товары появлятся сверху, но сортировка по цене не происходит.
Вторая проблема -- MySQL запрос медленный.
Вот, кстати, и сам запрос:
Вопрос такой -- на правильном ли я, вообще, пути и как сделать правильно.
Есть вариант -- модифицировать темплейт страницы категории и делать два запроса -- один с "hfo_featured"=1, другой с "hfo_featured" = 0 . Но мне кажется, это не очень правильно.
Спасибо
Rudolf
Что я пытаюсь сделать:
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