Диагностика проблемы: зачем исключать товары по метаданным из связанных товаров WooCommerce
В WooCommerce стандартный механизм связанных товаров (related products) основывается на категориях и тегах. Однако на практике часто требуется исключить из подборки товаров, которые по различным причинам не должны показываться как связанные: распроданные товары, товары с определённым статусом, товары с кастомными мета-полями (например, "только для внутреннего использования" или "архив").
Если не исключать такие товары, пользователь увидит нерелевантные или неактуальные предложения, что ухудшит UX и может снизить конверсию.
Пошаговое решение: фильтрация связанных товаров по метаданным
1. Определите метаданные для исключения
Для примера предположим, что у товаров есть мета-поле _exclude_from_related со значением yes, которое маркирует товары для исключения.
2. Добавьте фильтр для изменения запроса связанных товаров
В WooCommerce для изменения запроса связанных товаров используется фильтр woocommerce_related_products. Он позволяет заменить массив ID связанных товаров.
Пример кода, который исключает товары с мета-полем _exclude_from_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_posts = [];
foreach ($related_posts as $related_id) {
$exclude = get_post_meta($related_id, '_exclude_from_related', true);
if ($exclude !== 'yes') {
$filtered_posts[] = $related_id;
}
}
// Если после фильтрации нет связанных товаров, вернуть оригинальный массив
return !empty($filtered_posts) ? $filtered_posts : $related_posts;
}3. Разместите код в functions.php или в кастомном плагине
Лучше всего добавить этот код в дочернюю тему в functions.php или создать небольшой плагин, чтобы сохранить изменения при обновлении темы.
Проверка результата после внедрения
- Создайте или отредактируйте товар, добавив мета-поле
_exclude_from_relatedсо значениемyes. - Откройте страницу товара, у которого выводятся связанные товары.
- Проверьте, что товар с мета-полем
_exclude_from_related = yesне отображается в блоке связанных товаров. - Если товары не отображаются, попробуйте очистить кэш сайта или плагинов кэширования.
Частые ошибки и как их исправить
- Ничего не меняется после добавления кода
— Проверьте, что фильтр правильно подключен и код без синтаксических ошибок.
— Убедитесь, что мета-поле действительно существует у товаров и записано корректно. - Пустой блок связанных товаров
— Если после фильтрации нет связанных товаров, код возвращает оригинальный массив. Если не хотите показывать ничего, можно изменить поведение в коде. - Кэширование мешает видеть изменения
— Очистите кэш браузера, кэш плагинов и серверный кэш (например, Redis, Varnish). - Код размещён в неподходящем месте
— Проверьте, что код добавлен в активную тему или плагин и выполняется на фронтенде.
Практические советы по производительности и безопасности
- Используйте кэширование результатов мета-запросов, если на сайте много товаров и связанных товаров.
- Не делайте тяжелых запросов внутри фильтра — используйте
get_post_meta, который оптимизирован для выборки мета-данных. - Для сложных условий исключения лучше добавить индексирование мета-данных в базу или использовать сторонние решения типа ElasticSearch.
- Проверяйте типы данных в мета-полях, чтобы избежать ошибок PHP.
Сравнение способов исключения товаров из связанных товаров в WooCommerce
| Метод | Где реализуется | Плюсы | Минусы |
|---|---|---|---|
Фильтр woocommerce_related_products с проверкой метаданных |
functions.php или плагин | Простой, гибкий, не требует изменения ядра | Зависит от правильного заполнения мета-полей |
Изменение SQL запроса через posts_clauses |
functions.php или плагин | Гибкий контроль, можно фильтровать по сложным условиям | Сложнее в поддержке, возможны ошибки в SQL |
| Использование сторонних плагинов для управления связанными товарами | Плагин | Готовые решения, интерфейс управления | Может влиять на производительность, лишние зависимости |