Диагностика проблемы: почему товары с определёнными метаданными появляются в связанных товарах
В стандартной логике WooCommerce связанные товары подбираются на основе категорий, тегов или атрибутов товара. Однако иногда необходимо исключить из подборки товары, которые имеют определённое пользовательское поле (метаданные). Например, товары со статусом "скрыт", товары из акционной серии или товары с ограниченной доступностью.
Проблема в том, что стандартный функционал WooCommerce не предусматривает фильтрацию связанных товаров по метаданным, поэтому исключить такие товары без доработок невозможно.
Пошаговое решение: фильтрация связанных товаров по метаданным через код
1. Добавляем фильтр для изменения аргументов запроса связанных товаров
Для исключения товаров по метаданным используем фильтр woocommerce_related_products_args. Он позволяет модифицировать параметры WP_Query, который получает связанные товары.
add_filter('woocommerce_related_products_args', 'exclude_related_products_by_meta', 10, 1);
function exclude_related_products_by_meta($args) {
// Исключаем товары с мета ключом '_exclude_related' и значением 'yes'
$meta_query = array(
array(
'key' => '_exclude_related',
'value' => 'yes',
'compare' => '!=',
),
);
if ( isset($args['meta_query']) ) {
$args['meta_query'][] = $meta_query[0];
} else {
$args['meta_query'] = $meta_query;
}
return $args;
}2. Добавляем поле метаданных в товары, которые нужно исключить
Для товаров, которые не должны появляться в связанных, необходимо добавить мета-ключ _exclude_related со значением yes. Это можно сделать вручную через админку (добавить пользовательское поле) или программно.
update_post_meta($product_id, '_exclude_related', 'yes');Проверка результата после внедрения
Чтобы убедиться, что решение сработало, сделайте следующее:
- Откройте страницу товара, у которого в связанных товарах раньше появлялись исключаемые товары.
- Проверьте, что товары с метаданными
_exclude_related = yesне отображаются в блоке связанных товаров. - Очистите кеш сайта и браузера, если вывод кэшируется.
Частые ошибки и как их исправить
- Метаданные не добавлены или неверно заданы: убедитесь, что для исключаемых товаров действительно установлен мета-ключ
_exclude_relatedсо значениемyes. - Кеширование мешает увидеть изменения: почистите кеш плагинов (например, WP Rocket, W3 Total Cache) и браузера.
- Фильтр применяется, но связанные товары не изменились: возможно, тема или плагин переопределяют логику вывода связанных товаров. Проверьте, не фильтруется ли
woocommerce_related_products_argsв других местах. - Ошибка в синтаксисе кода: внимательно проверьте код на наличие синтаксических ошибок, используйте WP_DEBUG для отладки.
Практические советы по производительности и безопасности
- Добавляйте метаданные только для тех товаров, которые действительно нужно исключить — избыточное использование
meta_queryможет замедлить запросы к базе. - Не используйте слишком сложные мета-запросы — для большого каталога товаров лучше реализовать кэширование результатов или использовать transient API.
- Размещайте код в дочерней теме или в плагине, чтобы избежать потери изменений при обновлении WooCommerce или темы.
- Обязательно проверяйте права доступа при добавлении метаданных программно, чтобы избежать ошибок безопасности.
Сравнение вариантов решения
| Метод | Преимущества | Недостатки | Рекомендуется для |
|---|---|---|---|
Фильтр woocommerce_related_products_args с meta_query |
Гибко, напрямую интегрируется в запрос, не требует сторонних плагинов | Может замедлить запросы при большом количестве товаров с метаданными | Средние и крупные магазины с контролируемым объемом |
| Плагин для управления связями товаров | Удобный интерфейс, дополнительные функции | Может конфликтовать с темой или другими плагинами, нагрузка на сайт | Малые магазины без разработки |
| Жёсткое исключение через JS (скрытие элементов) | Быстрое исправление без изменения PHP | Неэффективно, товары грузятся на страницу, ухудшает SEO | Кратковременная мера |