WooCommerce: исключение товаров из связанных и подбор на основе мета-данных

Диагностика проблемы: почему нужно исключать товары из связанных

При использовании стандартного функционала 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

Добавь в закладки и поделись с друзьями:

⭐⭐⭐⭐⭐
Как автоматизировать создание категорий в WordPress по шаблону с помощью кода и плагинов
25.02.2026
Как избежать ошибок при интеграции YARPP с WooCommerce
24.04.2026
WooCommerce: как исключить товары по метаданным из списка связанных товаров
30.04.2026
YARPP и WooCommerce: как сделать подбор связанных товаров в интернет-магазине
11.02.2026
YARPP фильтры и хуки для кастомизации выбора связанных записей в WordPress
19.11.2025
×

AI-плагин

WPGPT
Сам создает статьи для вашего сайта WordPress

SEO и мета-теги

Парсинг конкурентов

Изображения

Комментарии

Подробнее