Диагностика проблемы: почему нужно исключать товары из связанных
При использовании стандартного функционала WooCommerce для вывода связанных товаров часто возникает ситуация, когда в списке появляются неподходящие позиции: распроданные товары, товары с определёнными метками или категории, которые не должны отображаться в рекомендациях. Это снижает конверсию и ухудшает пользовательский опыт.
Основные причины появление нежелательных товаров в связанных:
- Отсутствие фильтрации по статусу или кастомным мета-данным.
- Стандартный алгоритм WooCommerce не учитывает бизнес-логику магазина.
- Конфликты с плагинами, которые добавляют кастомные поля без учёта связанных товаров.
Как WooCommerce формирует связанные товары
По умолчанию WooCommerce использует три типа связей:
- Upsells – товары, которые магазин рекомендует вместо текущего.
- Cross-sells – товары, которые предлагаются в корзине.
- Related products – товары, связанные по категориям и тегам.
Для связанных товаров WooCommerce запускает WP_Query, в котором можно применить дополнительные параметры, например, meta_query для исключения товаров с определёнными мета-данными.
Пошаговое решение: исключение товаров из связанных по мета-данным
1. Добавление мета-поля для товаров
Предположим, у вас есть мета-поле exclude_from_related типа boolean, которое ставится на товаре, если его нужно исключить из списка связанных.
2. Фильтрация WP_Query для связанных товаров
Чтобы исключить такие товары, нужно использовать фильтр woocommerce_related_products_args и добавить параметр meta_query с условием exclude_from_related != 1.
add_filter('woocommerce_related_products_args', 'exclude_products_from_related_by_meta', 10, 1);
function exclude_products_from_related_by_meta($args) {
if (!isset($args['meta_query'])) {
$args['meta_query'] = [];
}
$args['meta_query'][] = [
'key' => 'exclude_from_related',
'value' => '1',
'compare' => '!='
];
return $args;
}3. Исключение распроданных товаров
Также логично исключать товары со статусом outofstock. Для этого добавим условие по мета-ключу _stock_status:
add_filter('woocommerce_related_products_args', 'exclude_outofstock_and_custom_meta', 20, 1);
function exclude_outofstock_and_custom_meta($args) {
if (!isset($args['meta_query'])) {
$args['meta_query'] = [];
}
$args['meta_query'][] = [
'relation' => 'AND',
[
'key' => 'exclude_from_related',
'value' => '1',
'compare' => '!='
],
[
'key' => '_stock_status',
'value' => 'outofstock',
'compare' => '!='
]
];
return $args;
}Проверка результата после внедрения
Чтобы убедиться, что товары с мета-полем exclude_from_related=1 и распроданные товары не показываются в связанных:
- В админке поставьте мета-поле
exclude_from_relatedв 1 на нескольких товарах. - Отметьте несколько товаров со статусом «нет в наличии».
- Откройте страницу одного из товаров, у которого в связанных должны отображаться эти товары.
- Убедитесь, что товары с исключающими мета-значениями отсутствуют в списке.
Для дополнительной проверки можно временно вывести аргументы запроса для связанных товаров, например, с помощью var_dump($args) внутри фильтра.
Частые ошибки и как их исправить
- Мета-ключ не установлен у товаров. Убедитесь, что у нужных товаров есть мета-поля с правильными значениями.
- Конфликт с другими плагинами, изменяющими
woocommerce_related_products_args. Проверьте приоритеты фильтров, попробуйте увеличить приоритет вашего фильтра. - Неправильное сравнение в
meta_query. Для boolean-значений используйте строковые '1' и '0', а не числовые 1 и 0. - Кэширование мешает обновлению. Очистите кэш WordPress и кэш браузера после внесения изменений.
Практические советы по производительности и безопасности
- Используйте индексы для мета-ключей. Для крупных магазинов индексируйте таблицу
wp_postmetaпо ключуmeta_key, чтобы ускорить запросы. - Минимизируйте количество условий в
meta_query. Слишком сложные запросы могут замедлить загрузку страниц. - Не храните чувствительные данные в мета-полях, которые используются для фильтрации. Защищайте данные с помощью ролей и прав доступа.
- Используйте транзиенты или объектный кэш для результатов сложных запросов связанных товаров.
Сравнение методов исключения товаров из связанных
| Метод | Плюсы | Минусы | Пример использования |
|---|---|---|---|
Фильтр woocommerce_related_products_args с meta_query |
Гибкость, не требует изменения шаблонов | Нагрузка на базу при большом количестве условий | Показано в статье |
| Изменение шаблона вывода связанных товаров | Полный контроль над логикой отображения | Требует поддержки и обновлений при смене темы | Кастомный шаблон related.php |
| Использование плагинов для управления связанными товарами | Простота настройки, UI для админки | Может конфликтовать и влиять на производительность | Плагины типа YITH Related Products |