WooCommerce: как автоматически исключать распроданные товары из связанных товаров

Проблема: распроданные товары отображаются в связанных товарах WooCommerce

В интернет-магазинах на WooCommerce часто возникает ситуация, когда в блоке связанных товаров (related products) появляются товары, которых нет в наличии. Это негативно влияет на пользовательский опыт и может привести к снижению конверсии. WooCommerce по умолчанию не исключает товары со статусом "нет в наличии" из связанных товаров, поэтому требуется доработка.

Диагностика проблемы

Чтобы убедиться, что проблема связана именно с отображением распроданных товаров в блоке связанных товаров, выполните следующие шаги:

  • Перейдите на страницу любого товара, у которого в связанных товарах присутствуют товары со статусом "нет в наличии".
  • Проверьте настройки WooCommerce -> Товары -> Запасы, убедитесь, что управление запасами включено и статус отсутствия товара отображается корректно.
  • Откройте консоль браузера и убедитесь, что нет JavaScript-ошибок, которые могут влиять на вывод блока связанных товаров.
  • Проверьте, не используется ли кастомный шаблон для связанных товаров, который может игнорировать статус наличия.

Пошаговое решение: исключаем распроданные товары из связанных товаров

Для решения задачи нужно изменить запрос WordPress, который выводит связанные товары. Это делается с помощью фильтра woocommerce_related_products_args. Ниже приведён пример кода, который исключает из связанных товаров товары со статусом "нет в наличии":

add_filter('woocommerce_related_products_args', 'exclude_out_of_stock_from_related_products', 10, 1); 
function exclude_out_of_stock_from_related_products($args) {
    // Получаем ID товаров, которые отсутствуют на складе
    $out_of_stock_ids = wc_get_products(array(
        'status' => 'publish',
        'limit' => -1,
        'stock_status' => 'outofstock',
        'return' => 'ids'
    ));

    if (!empty($out_of_stock_ids)) {
        // Добавляем их в параметр 'post__not_in' для исключения из запроса связанных товаров
        if (isset($args['post__not_in'])) {
            $args['post__not_in'] = array_merge($args['post__not_in'], $out_of_stock_ids);
        } else {
            $args['post__not_in'] = $out_of_stock_ids;
        }
    }

    return $args;
}

Добавьте данный код в файл functions.php вашей дочерней темы или в отдельный плагин для кастомных функций.

Альтернативный способ: исключение через параметр запроса таксономии и метаполя

Если вы хотите более лёгкое и быстрое решение без получения всех ID товаров, можно добавить условие метаполя _stock_status в запрос:

add_filter('woocommerce_related_products_args', 'exclude_out_of_stock_via_meta_query', 10, 1);
function exclude_out_of_stock_via_meta_query($args) {
    $args['meta_query'][] = array(
        'key' => '_stock_status',
        'value' => 'instock',
        'compare' => '='
    );
    return $args;
}

Этот способ быстрее, но зависит от корректного обновления метаполя _stock_status у товаров.

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

Для проверки:

  • Очистите кеш сайта и браузера (если используется кеширование).
  • Обновите страницу товара с блоком связанных товаров.
  • Убедитесь, что в блоке нет товаров со статусом "нет в наличии".
  • Для проверки можно временно добавить в функцию error_log(print_r($args, true)); и посмотреть параметры запроса в логах.

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

  • Код не работает — связанные товары не изменились: возможно, используется кастомный шаблон, который формирует запрос самостоятельно. Нужно проверить тему и плагины на переопределение шаблонов related.php или функций.
  • Все связанные товары исчезли: при неправильном объединении массива с post__not_in можно исключить и текущий товар. Убедитесь, что текущий ID товара не добавлен в post__not_in.
  • Высокая нагрузка на базу при большом количестве товаров: получение всех ID распроданных товаров через wc_get_products может быть ресурсоёмким. Используйте альтернативный метод с meta_query.
  • Статус наличия не обновляется: убедитесь, что для товаров включено управление запасами и статус обновляется корректно.

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

  • Добавляйте код в дочернюю тему или отдельный плагин, чтобы избежать потери при обновлении.
  • Используйте альтернативный способ с meta_query, если на сайте много товаров.
  • При использовании кеширующих плагинов очистите кеш после добавления кода.
  • Избегайте прямого SQL-запроса для получения ID товаров без необходимости — используйте WC API.

Сравнение методов исключения распроданных товаров из связанных товаров

МетодПлюсыМинусыКогда использовать
Получение ID через wc_get_products Точный контроль, исключаются только распроданные Высокая нагрузка на большие каталоги Маленькие и средние магазины
Добавление meta_query по _stock_status Быстрая фильтрация, меньше нагрузки Зависит от корректности обновления метаполя Большие магазины с часто обновляемым статусом

Добавь в закладки и поделись с друзьями:

⭐⭐⭐⭐⭐
Как создать кастомные шаблоны связанных записей в WordPress
22.12.2025
Как использовать YARPP для выборочной подгрузки связанных записей через AJAX в WordPress
18.02.2026
Как создать функционал автозаполнения форм в WordPress: пошаговое руководство
29.11.2025
YARPP и WooCommerce: как сделать подбор связанных товаров в интернет-магазине
11.02.2026
WooCommerce: как исключить товары по метаданным из списка связанных товаров
15.06.2026
×

AI-плагин

WPGPT
Сам создает статьи для вашего сайта WordPress

SEO и мета-теги

Парсинг конкурентов

Изображения

Комментарии

Подробнее