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