Проблема: ненужные товары появляются в связанных товарах WooCommerce
В стандартной функциональности WooCommerce связанные товары подбираются автоматически на основе категорий и тегов. Однако иногда необходимо исключить из этого списка товары, которые имеют определённые метаданные (custom fields). Например, товары, помеченные как "неактивные", "архивные" или с определённым флагом, не должны отображаться в блоке связанных товаров.
Диагностика проблемы
Для начала убедитесь, что в карточках товаров действительно есть метаданные, по которым нужно фильтровать. Это можно проверить в админке WooCommerce или с помощью плагина Advanced Custom Fields или любого редактора метаданных.
Затем проверьте, что связанные товары выводятся стандартно и фильтрация по ним не производится. Для этого откройте страницу товара на фронтенде и посмотрите блок «Связанные товары».
Если есть подозрение, что фильтрация не работает, проверьте, не переопределяется ли шаблон related.php в вашей теме.
Как исключить товары по метаданным из связанных товаров WooCommerce
Для решения задачи используем фильтр WooCommerce woocommerce_related_products. Он позволяет изменить массив ID товаров, которые WooCommerce выводит как связанные.
Пример кода для functions.php вашей темы или в отдельном плагине:
add_filter('woocommerce_related_products', 'exclude_related_products_by_meta', 10, 3);
function exclude_related_products_by_meta($related_posts, $product_id, $args) {
$filtered = [];
foreach ($related_posts as $related_id) {
// Получаем значение мета-данных, например 'exclude_from_related'
$exclude_flag = get_post_meta($related_id, 'exclude_from_related', true);
// Если флаг не установлен или равен false, добавляем товар в вывод
if (empty($exclude_flag) || $exclude_flag === 'no') {
$filtered[] = $related_id;
}
}
return $filtered;
}
В этом примере мы предполагаем, что у товаров, которые нужно исключить, в метаданных exclude_from_related стоит значение "yes". Остальные товары остаются в списке.
Как добавить мета-данные товарам
- В админке WooCommerce откройте нужный товар.
- В разделе "Дополнительные поля" или с помощью плагина ACF добавьте поле
exclude_from_relatedс типом "выбор" или "текст". - Установите значение
yesдля товаров, которые хотите исключить.
Проверка результата после внедрения
После добавления фильтра:
- Очистите кэш сайта и браузера.
- Обновите страницу товара на фронтенде, где выводятся связанные товары.
- Проверьте, что товары с мета-данными
exclude_from_related = yesне отображаются в блоке связанных. - Если не работает, включите WP_DEBUG и проверьте ошибки.
Частые ошибки и как их исправить
- Фильтр не срабатывает: возможно, другой плагин или тема переопределяет вывод связанных товаров. Проверьте шаблон
related.phpв теме. - Неправильное имя мета-ключа: убедитесь, что используете корректный ключ мета-данных.
- Кэширование: кэш может показывать устаревшие данные. Очистите серверный и плагин-кэш.
- Ошибка в коде: проверьте синтаксис PHP, особенно при копировании кода.
Практические советы по производительности и безопасности
- Используйте правильные типы данных в мета-полях — лучше булево или строковое «yes/no», чтобы упростить проверку.
- Не выполняйте лишних запросов к базе данных — в фильтре используйте
get_post_metaс параметромtrueдля одиночного значения. - Если сайт большой, кешируйте результаты фильтрации, чтобы не делать повторные запросы.
- Всегда тестируйте код на staging-среде перед внедрением в продакшн.
Сравнение вариантов решения
| Подход | Описание | Плюсы | Минусы |
|---|---|---|---|
Фильтр woocommerce_related_products |
Изменение массива ID связанных товаров через PHP-фильтр | Простота реализации, гибкость, отсутствие вмешательства в шаблоны | Не влияет на SQL-запрос, потенциально не оптимально на больших сайтах |
| Переопределение шаблона related.php | Полный контроль над выводом связанных товаров | Максимальная кастомизация | Требует знания PHP и шаблонной структуры WooCommerce, сложнее поддерживать |
| Плагины для кастомизации связанных товаров | Готовые решения с UI | Удобство, не требует кода | Может влиять на производительность, ограничена кастомизация |