Диагностика проблемы: почему товары без наличия отображаются в 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 для фильтрации на страницах магазина | Работает с любыми стандартными виджетами, универсально | Может влиять на все запросы, требует аккуратности | Для глобальной фильтрации на каталоге |
| Плагины фильтрации товаров | Простота настройки, готовые интерфейсы | Могут замедлять сайт, лишний функционал | Для сложных фильтров и без кода |