Вопрос или проблема
Я добавил атрибуты для фильтрации продуктов на основе их выбора. Например, у меня есть поле с названием ‘плитка’, которое может быть ‘да’ или ‘нет’. Если человек ставит галочку ‘да’, показываются все продукты с атрибутом ‘да’. Все продукты с атрибутом ‘нет’ не отображаются.
Как я могу отображать все продукты, которые не отфильтрованы, НИЖЕ отфильтрованного запроса (т.е. показывать все продукты с ‘нет’ ниже фильтра продукта)?
Внутри моего файла functions.php, я полагаю, что так запрашиваются отфильтрованные продукты:
function sort_products_by_positive_attributes($query) {
if (!is_admin() && $query->is_main_query() && is_woocommerce()) {
// Сначала вам нужно получить все продукты вместе с их количеством положительных атрибутов
$products_with_scores = [];
if (!empty($query->posts)) {
foreach ($query->posts as $post) {
$product = wc_get_product($post->ID);
$score = get_product_positive_attributes_count($product);
$products_with_scores[$post->ID] = $score;
}
}else {
}
// Затем вы отсортируете продукты по их баллам
uasort($products_with_scores, function($a, $b) {
return $b - $a;
});
// После сортировки измените запрос, чтобы упорядочить по ID в отсортированном порядке
$sorted_ids = array_keys($products_with_scores);
$query->set('orderby', 'post__in');
$query->set('post__in', $sorted_ids);
// Запрос для отображения неотфильтрованных здесь
}
}
//add_action('pre_get_posts', 'sort_products_by_positive_attributes');
function get_product_positive_attributes_count($product) {
// Здесь вы реализуете логику подсчета числа положительных атрибутов
$score = 0;
// для каждого атрибута, если он положительный, увеличьте $score
return $score;
}
Ответ или решение
Фильтрация по атрибутам: Как отобразить все непротестированные товары ниже отфильтрованных результатов
В рамках управления интернет-магазином на платформе WooCommerce, вам может быть необходимо реализовать функционал фильтрации товаров по определённым атрибутам, например, по атрибуту "плитка" (tiled). Это может включать отображение товаров, у которых установлен атрибут "да", в то время как товары с атрибутом "нет" должны быть скрыты. Однако, часто возникает задача показать все непротестированные товары (например, с атрибутом "нет") под отфильтрованным списком. В данной статье мы подробно рассмотрим, как это можно сделать.
1. Настройка начального запроса
Прежде чем перейти к низам результата, необходимо убедиться, что ваш код отфильтровывает товары правильно. В вашей функции sort_products_by_positive_attributes
, мы видим основной код запроса. Изменить логику фильтрации может быть непросто, однако это вполне выполнимо.
2. Логика фильтрации
Чтобы отобразить все непротестированные товары, нам нужно сделать два отдельных запроса:
- Запрос для отображения отфильтрованных товаров (с атрибутом "да").
- Запрос для отображения всех непротестированных товаров (с атрибутом "нет").
Вот пример кода, который прояснит это:
function sort_products_by_positive_attributes($query) {
if (!is_admin() && $query->is_main_query() && is_woocommerce()) {
// условие для фильтрации товаров
if (isset($_GET['tiled']) && $_GET['tiled'] === 'yes') {
// Стандартный запрос для отфильтрованных товаров
$query->set('meta_query', array(
array(
'key' => 'tiled',
'value' => 'yes',
'compare' => '='
)
));
}
// Получаем все непротестированные (с атрибутом 'нет') товары
$non_filtered_query = new WP_Query(array(
'post_type' => 'product',
'meta_query' => array(
array(
'key' => 'tiled',
'value' => 'no',
'compare' => '='
)
),
'posts_per_page' => -1 // Получаем все
));
// Сохраняем ID непротестированных товаров для последующего использования
$non_filtered_ids = wp_list_pluck($non_filtered_query->posts, 'ID');
// Запедь для все непротестированные товары
if (count($non_filtered_ids) > 0) {
$query->set('post__in', array_merge($query->get('post__in'), $non_filtered_ids));
}
// Ваш код сортировки здесь
}
}
//add_action('pre_get_posts', 'sort_products_by_positive_attributes');
3. Пояснение кода
-
Сначала мы проверяем условие фильтрации. Если существует GET-параметр
tiled
со значениемyes
, значит, мы хотим отображать только товары с атрибутом "да". -
Запрос для непротестированных товаров создается с помощью
WP_Query
. Он получает все товары, которые имеют атрибут "нет". Мы используемposts_per_page => -1
, чтобы получить все товары без ограничения. -
Объединение ID для двух запросов осуществляется с помощью
array_merge
, что позволяет добавить все результаты второй выборки (с атрибутом "нет") к результатам первой выборки.
Заключение
Теперь, когда данная логика внедрена в ваш файл functions.php
, вы сможете фильтровать и отображать не только отфильтрованные товары, но и все непротестированные товары ниже в результирующем списке. Это значительно улучшит опыт покупателей, которые ценят возможность просматривать полный ассортимент даже при применении фильтрации.
Следуя этому подходу, вы не только повысите функциональность своего интернет-магазина, но и создадите более удобный интерфейс для пользователей.