Фильтрация по атрибутам – как отобразить все неотфильтрованные продукты ниже запроса

Вопрос или проблема

Я добавил атрибуты для фильтрации продуктов на основе их выбора. Например, у меня есть поле с названием ‘плитка’, которое может быть ‘да’ или ‘нет’. Если человек ставит галочку ‘да’, показываются все продукты с атрибутом ‘да’. Все продукты с атрибутом ‘нет’ не отображаются.

Как я могу отображать все продукты, которые не отфильтрованы, НИЖЕ отфильтрованного запроса (т.е. показывать все продукты с ‘нет’ ниже фильтра продукта)?

Внутри моего файла 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. Логика фильтрации

Чтобы отобразить все непротестированные товары, нам нужно сделать два отдельных запроса:

  1. Запрос для отображения отфильтрованных товаров (с атрибутом "да").
  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, вы сможете фильтровать и отображать не только отфильтрованные товары, но и все непротестированные товары ниже в результирующем списке. Это значительно улучшит опыт покупателей, которые ценят возможность просматривать полный ассортимент даже при применении фильтрации.

Следуя этому подходу, вы не только повысите функциональность своего интернет-магазина, но и создадите более удобный интерфейс для пользователей.

Оцените материал
Добавить комментарий

Капча загружается...