Диагностика проблемы: почему нужно исключать товары из связанных товаров WooCommerce
По умолчанию WooCommerce выводит связанные товары (upsells, cross-sells, related products) на основе категорий и тегов. Однако иногда требуется исключить из этих списков определённые товары, например, товары, которые сняты с продажи, товары с определённым статусом или с кастомным метаполем. Без корректной фильтрации пользователь увидит нерелевантные или запрещённые к показу товары, что ухудшит UX и конверсию.
Пошаговое решение: исключение товаров по метаданным из списка связанных товаров
1. Определяем метаполе для исключения
Для примера возьмём метаполе exclude_from_related со значением yes. Все товары с этим метаполем не должны появляться в списках связанных товаров.
2. Используем фильтр woocommerce_related_products для исключения товаров
Добавьте следующий код в файл functions.php вашей дочерней темы или в отдельный плагин:
add_filter('woocommerce_related_products', 'exclude_products_from_related_by_meta', 10, 3);
function exclude_products_from_related_by_meta($related_posts, $product_id, $args) {
if (empty($related_posts)) {
return $related_posts;
}
$filtered_posts = array();
foreach ($related_posts as $related_id) {
$exclude = get_post_meta($related_id, 'exclude_from_related', true);
if ($exclude !== 'yes') {
$filtered_posts[] = $related_id;
}
}
return $filtered_posts;
}3. Проверяем набор связанных товаров
После добавления фильтра зайдите на страницу товара во фронтенде и убедитесь, что товары с метаполем exclude_from_related = yes не отображаются в блоке связанных товаров.
Как проверить, что решение сработало
- Создайте тестовый товар с метаполем
exclude_from_related = yes(через админку или плагин для метаполей). - Откройте страницу другого товара, который обычно показывает этот тестовый товар в связанных.
- Убедитесь, что тестовый товар не отображается среди связанных, остальные товары видны.
- Для контроля можно временно вывести ID связанных товаров через фильтр и проверить массив.
Частые ошибки и как исправить
- Пропущена проверка на пустой массив: если не обрабатывать пустой
$related_posts, может быть ошибка. В коде выше это учтено. - Неправильное значение метаполя: убедитесь, что значение именно
yes, регистр важен. - Кэширование: если используется кэш (объектный или плагин), то изменения могут не отразиться сразу. Очистите кэш.
- Модификация других плагинов: если другие плагины тоже изменяют связанные товары, они могут конфликтовать. Проверьте при отключенных плагинах.
Практические советы для улучшения производительности и безопасности
- Для больших каталогов добавьте индексацию по метаполям в базе, чтобы ускорить выборку.
- Используйте трансзиенты для кеширования результата фильтрации, если блок связанных товаров вызывается часто.
- Обязательно проверяйте права доступа и избегайте вывода метаданных в публичных местах.
Альтернативные варианты решения
| Метод | Описание | Плюсы | Минусы |
|---|---|---|---|
Фильтр woocommerce_related_products | Исключение по ID после получения набора связанных товаров. | Простой, работает с нативным функционалом WooCommerce, гибкий. | Может влиять на производительность при большом количестве товаров. |
| Переопределение SQL запроса по связям | Изменение SQL запроса, который формирует связанные товары. | Более эффективное исключение на уровне БД. | Сложнее реализовать, требуется понимание WP_Query и WooCommerce SQL. |
| Использование плагинов для управления связями | Плагины с UI для настройки исключений. | Удобно для админов без кода. | Могут быть избыточными, замедлять сайт. |
Заключение
Исключение товаров из связанных по метаданным — частая задача при гибкой настройке WooCommerce. Использование фильтра woocommerce_related_products с проверкой метаполей — надёжный и проверенный способ. Важно тестировать на реальных данных, учитывать кэширование и взаимодействие с другими плагинами. Для более сложных сценариев можно рассмотреть изменение SQL-запросов или специализированные плагины.