Диагностика проблемы: почему нужно исключать товары из связанных товаров
В стандартной логике WooCommerce связанные товары подбираются на основе категорий, тегов или атрибутов. Однако на практике часто возникает необходимость исключить из списка определённые товары, например, товары с метаданными «распродано», «скрыто» или товары, которые не должны отображаться в рекомендациях по бизнес-логике.
Без правильного исключения таких товаров пользователь видит нерелевантные предложения, что снижает конверсию и ухудшает UX.
Пошаговое решение: фильтрация связанных товаров по метаданным
1. Определение метаданных для исключения
Сначала необходимо точно знать, по какому метаданному нужно исключать товары. Частые примеры:
_stock_status = 'outofstock'— исключаем товары, которых нет в наличии;_visibility = 'hidden'— товары, скрытые из каталога;custom_flag = 'exclude'— кастомное поле для исключения.
2. Добавление фильтра на запрос связанных товаров
Для изменения выборки связанных товаров используется фильтр woocommerce_related_products_args. В нем можно добавить дополнительные условия для исключения товаров по метаданным.
add_filter('woocommerce_related_products_args', 'exclude_products_by_meta_from_related', 10, 1); function exclude_products_by_meta_from_related($args) { // Получаем ID текущего товара $current_product_id = get_the_ID(); // Добавляем параметры meta_query для исключения товаров $args['meta_query'] = array( 'relation' => 'AND', array( 'key' => '_stock_status', 'value' => 'outofstock', 'compare' => '!=' ), array( 'key' => 'custom_flag', 'value' => 'exclude', 'compare' => '!=' ), ); // Чтобы исключить сам товар из списка связанных $args['post__not_in'][] = $current_product_id; return $args; }3. Кэширование и производительность
Если у вас большой каталог, рекомендуется добавить кэширование результатов запроса через Transients API, чтобы снизить нагрузку на базу данных.
Проверка результата после внедрения
- Откройте страницу товара, для которого вы применили фильтр.
- Проверьте блок связанных товаров — исключённые по метаданным товары не должны отображаться.
- Для дополнительной проверки можно временно вывести массив аргументов
$argsв фильтре с помощьюerror_log(print_r($args, true)). - Если товары с нужными метаданными всё ещё видны, проверьте правильность ключей и значений в
meta_query.
Частые ошибки и как исправить
- Неправильные ключи метаданных: Удостоверьтесь, что используете точные имена метаполей из базы данных. Проверьте через phpMyAdmin или плагин типа «Show Current Meta».
- Отсутствие фильтра в нужном хуке: Используйте именно
woocommerce_related_products_argsдля изменения связанных товаров, не перепутайте с другими фильтрами. - Конфликты с кэшированием: Если на сайте активны кеш-плагины, очистите кэш после внесения изменений.
- Неправильное построение
meta_query: Для исключения используйте'compare' => '!='и правильно указывайте значения.
Практические советы по безопасности и производительности
- Не добавляйте сложные и многочисленные
meta_queryбез необходимости, это замедляет запросы. - Используйте Transients API для кэширования результатов фильтрации, чтобы избежать повторных тяжелых запросов.
- Всегда тестируйте изменения на копии сайта или staging-среде, чтобы не повлиять на живой магазин.
- Регулярно проверяйте обновления WooCommerce и совместимость кастомных функций с ними.
Сравнение вариантов решения
| Метод | Плюсы | Минусы |
|---|---|---|
Фильтр woocommerce_related_products_args | Гибко, легко интегрируется, минимальный код | Может влиять на производительность при большом количестве условий |
| Кастомный запрос WP_Query для связанных товаров | Полный контроль над выборкой | Требует замены шаблонов, может конфликтовать с WooCommerce |
| Плагины типа YITH WooCommerce Related Products | Готовое решение, простота настройки | Меньше гибкости в фильтрации по метаданным, дополнительная нагрузка |