WooCommerce: как отфильтровать товары по наличию в Elementor

Диагностика проблемы: почему товары без наличия отображаются в Elementor

В стандартных виджетах WooCommerce для вывода товаров в Elementor часто отображаются все товары, включая те, которых нет в наличии. Это может сбивать пользователей и приводить к неудачным заказам. Основная причина — отсутствие настройки фильтрации по параметру "наличие" в стандартных виджетах Elementor или шаблонах WooCommerce.

Для начала убедитесь, что в WooCommerce правильно настроен статус запасов. Перейдите в Товары > Все товары, откройте карточку товара и проверьте вкладку "Запасы" — поле "Управление запасами?" должно быть включено, а количество товара должно быть больше нуля для отображения как в наличии.

Пошаговое решение: фильтрация товаров по наличию в Elementor

1. Использование пользовательского запроса WP_Query с фильтрацией по запасам

Поскольку стандартный виджет "Товары" в Elementor не поддерживает фильтрацию по запасам, создадим кастомный виджет или shortcode с WP_Query, который будет выводить только товары в наличии.

function get_products_in_stock_shortcode($atts) {
    $args = array(
        'post_type' => 'product',
        'posts_per_page' => 12,
        'meta_query' => array(
            array(
                'key' => '_stock_status',
                'value' => 'instock',
                'compare' => '=',
            ),
        ),
    );
    $query = new WP_Query($args);
    if (!$query->have_posts()) {
        return '<p>Товары в наличии отсутствуют.</p>';
    }
    $output = '<ul class="products-list">';
    while ($query->have_posts()) {
        $query->the_post();
        $output .= '<li><a href="'.get_the_permalink().'">'.get_the_title().'</a></li>';
    }
    wp_reset_postdata();
    $output .= '</ul>';
    return $output;
}
add_shortcode('products_in_stock', 'get_products_in_stock_shortcode');

Вставьте шорткод [products_in_stock] в любой блок Elementor через виджет "Текстовый редактор" или "HTML".

2. Модификация стандартного запроса WooCommerce в Elementor через хук pre_get_posts

Если вы используете стандартный виджет "Товары" в Elementor и хотите фильтровать товары по наличию глобально на странице, можно добавить следующий код в functions.php вашей темы или в плагин для кастомных функций:

function filter_products_by_stock_status($query) {
    if (!is_admin() && $query->is_main_query() && (is_shop() || is_product_category() || is_product_tag())) {
        $meta_query = $query->get('meta_query');
        if (!is_array($meta_query)) {
            $meta_query = array();
        }
        $meta_query[] = array(
            'key' => '_stock_status',
            'value' => 'instock',
            'compare' => '=',
        );
        $query->set('meta_query', $meta_query);
    }
}
add_action('pre_get_posts', 'filter_products_by_stock_status');

Этот код заставит WooCommerce выводить на страницах магазина и категорий только товары в наличии.

Проверка результата после внедрения решения

  • На странице с шорткодом [products_in_stock] или на страницах магазина и категорий убедитесь, что отсутствуют товары с нулевым или отрицательным запасом.
  • В админке проверьте, что в карточках товаров с нулевым запасом отображается статус "Нет в наличии", а на сайте они не выводятся.
  • Используйте инструменты разработчика браузера, чтобы убедиться, что HTML-список содержит только ссылки на товары в наличии.

Частые ошибки и как их исправить

  • Кэширование выводит старые данные: Очистите кэш сайта и браузера, особенно если используете плагин кеширования (WP Super Cache, W3 Total Cache и др.).
  • WP_Query не фильтрует по метаданным: Проверьте, что ключ '_stock_status' верный и мета-запись существует для товаров. Можно проверить через phpMyAdmin или функцию get_post_meta($product_id, '_stock_status', true);.
  • Фильтр pre_get_posts не срабатывает: Убедитесь, что проверка условий в функции правильная, и код подключен в functions.php или плагине.
  • Товары с вариациями неправильно отображаются: В WooCommerce вариации управляют запасом отдельно. Для учета вариаций нужно усложнять запрос, что выходит за рамки простого фильтра.

Практические советы по безопасности и производительности

  • Не используйте тяжелые запросы с большим количеством товаров без пагинации — это нагрузит базу данных. Всегда ограничивайте число постов (posts_per_page).
  • Для кеширования вывода создайте transient или используйте объектный кеш, чтобы не запускать WP_Query на каждой загрузке.
  • Проверяйте права доступа при добавлении шорткодов или хуков, чтобы исключить утечки данных или нагрузку со стороны незарегистрированных пользователей.

Сравнение вариантов реализации фильтрации товаров по наличию

ПодходПлюсыМинусыПрименимость
Кастомный шорткод с WP_QueryГибкость, контроль вывода, можно вставлять где угодноНужно вставлять вручную, нет интеграции с Elementor виджетамиЛучше для отдельных блоков, лендингов
Хук pre_get_posts для фильтрации на страницах магазинаРаботает с любыми стандартными виджетами, универсальноМожет влиять на все запросы, требует аккуратностиДля глобальной фильтрации на каталоге
Плагины фильтрации товаровПростота настройки, готовые интерфейсыМогут замедлять сайт, лишний функционалДля сложных фильтров и без кода
WooCommerce: автоматическое изменение цен при акциях в Elementor
02.05.2026
Как добавить динамические картинки в Elementor для WordPress
20.03.2026
Как сделать автозаполнение форм в Elementor с помощью AJAX
26.01.2026
Динамические CSS стили в Elementor: создание и управление через код
13.03.2026
Как добавить нестандартные элементы в Elementor с помощью кода
28.12.2025