Проблема: нежелательные товары в блоке связанных товаров WooCommerce
Стандартный вывод связанных товаров в WooCommerce базируется на категории и тегах, что зачастую приводит к появлению товаров, которые не подходят для рекомендаций. Например, товары с определенным статусом, архивные позиции или товары с низким рейтингом могут мешать пользователю. Чтобы улучшить релевантность и повысить конверсию, требуется исключать товары по метаданным из списка связанных товаров.
Диагностика проблемы
Для начала нужно проверить, какие товары появляются в блоке связанных товаров, и есть ли среди них нежелательные позиции с определенными мета-полями. Это можно сделать через браузер и инструменты разработчика (DevTools):
- Откройте страницу товара с блоком связанных товаров.
- Определите ID товаров, которые должны быть исключены.
- Проверьте в базе данных или через WP-админ панель, какие мета-данные у них установлены (используйте плагин Advanced Custom Fields или напрямую запросы к базе).
Если такие метаданные присутствуют (например, _exclude_related со значением yes), значит есть возможность фильтровать вывод по ним.
Как исключить товары по метаданным из связанных товаров WooCommerce
WooCommerce использует функцию wc_get_related_products() для получения ID связанных товаров. Для фильтрации можно использовать хук woocommerce_related_products, который позволяет изменить массив ID перед выводом.
Пример кода для исключения товаров с мета-ключом _exclude_related и значением yes:
add_filter('woocommerce_related_products', 'exclude_related_products_by_meta', 10, 3);
function exclude_related_products_by_meta($related_posts, $product_id, $args) {
if (empty($related_posts)) {
return $related_posts;
}
$filtered = [];
foreach ($related_posts as $related_id) {
$exclude = get_post_meta($related_id, '_exclude_related', true);
if ($exclude !== 'yes') {
$filtered[] = $related_id;
}
}
return $filtered;
}Добавьте этот код в файл functions.php активной темы или в кастомный плагин.
Объяснение работы кода
- Получаем текущий массив ID связанных товаров.
- Итерируем по каждому ID и проверяем мета-данные.
- Если мета-данные не указывают на исключение, оставляем товар.
- Возвращаем отфильтрованный список для вывода.
Проверка результата
Чтобы убедиться, что товары успешно исключены:
- Откройте страницу товара, где раньше показывался товар с мета
_exclude_related = yes. - Проверьте блок связанных товаров — исключённый товар не должен отображаться.
- Откройте исходный код страницы и найдите блок связанных товаров — убедитесь, что ID исключенных товаров отсутствуют.
- Для отладки можно временно добавить
error_log(print_r($filtered, true));в функцию, чтобы видеть результат в логах.
Частые ошибки и их исправление
- Ошибка: Фильтр не работает, и нежелательные товары продолжают показываться.
Причина: Возможно, кэширование страницы или объекта перекрывает изменения.
Решение: Очистите кэш плагинов (например, WP Rocket, W3 Total Cache) и серверный кэш, отключите кэширование во время тестирования. - Ошибка: Все связанные товары исчезли.
Причина: Все товары имеют мета_exclude_related = yesили неверная логика фильтра.
Решение: Проверьте мета-данные товаров, убедитесь, что есть хотя бы несколько товаров без мета или со значением отличным отyes. - Ошибка: Функция добавлена в плагин, но не работает.
Причина: Приоритет хуков или подключение кода происходит слишком рано или поздно.
Решение: Убедитесь, что код подключается после загрузки WooCommerce, например, через хукplugins_loadedили вfunctions.phpтемы.
Практические советы по производительности и безопасности
- Избегайте частых запросов
get_post_metaна больших массивах — кешируйте результаты, если планируете расширять функционал. - Не используйте тяжелые запросы в хуках, отвечающих за фронтенд, чтобы не замедлять загрузку страниц.
- Проверяйте права доступа при работе с метаданными, чтобы не раскрыть конфиденциальные данные.
- Если блок связанных товаров выводится через AJAX, убедитесь, что фильтр применяется и там, возможно, потребуется аналогичный фильтр для AJAX-запросов.
Альтернативные методы: плагин vs код
| Метод | Плюсы | Минусы |
|---|---|---|
| Код в functions.php | Гибкость, полностью под контролем, без зависимостей | Требует навыков программирования, риск ошибок |
| Плагин фильтрации товаров (например, Custom Related Products) | Простота настройки, интерфейс для управления | Может замедлять сайт, возможно платный функционал |