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

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

В WooCommerce стандартный механизм связанных товаров основан на категориях и тегах, что не всегда подходит для сложных бизнес-сценариев. Иногда необходимо исключить определённые товары из блока связанных товаров, например, товары с определённым мета-полем, статусом или пользовательской логикой. Без такой фильтрации в списке связанных могут появляться нерелевантные или устаревшие товары, что снижает конверсию и ухудшает UX.

Пошаговое решение: исключение товаров из связанных по метаданным

Добавление фильтра для исключения товаров по мета-ключу

Для исключения товаров из связанных нужно использовать фильтр woocommerce_related_products. В этом примере исключим товары с мета-полем _exclude_from_related со значением yes:

add_filter('woocommerce_related_products', 'exclude_products_from_related_by_meta', 10, 3);
function exclude_products_from_related_by_meta($related_posts, $product_id, $args) {
    global $wpdb;

    if (empty($related_posts)) {
        return $related_posts;
    }

    $placeholders = implode(',', array_fill(0, count($related_posts), '%d'));
    
    $query = $wpdb->prepare(
        "SELECT post_id FROM {$wpdb->postmeta} WHERE meta_key = %s AND meta_value = %s AND post_id IN ($placeholders)",
        '_exclude_from_related', 'yes', ...$related_posts
    );

    $excluded = $wpdb->get_col($query);

    if ($excluded) {
        // Удаляем исключённые товары из массива связанных
        $related_posts = array_diff($related_posts, $excluded);
    }

    return $related_posts;
}

Установка мета-поля для товаров

Чтобы исключить товар из связанных, нужно в админке добавить кастомное поле _exclude_from_related со значением yes. Это можно сделать вручную или программно при обновлении товара.

Проверка результата после внедрения

  • Откройте страницу товара на фронте.
  • Убедитесь, что товары с мета-полем _exclude_from_related = yes не отображаются в блоке связанных товаров.
  • Для проверки можно временно вывести массив ID связанных товаров с помощью error_log(print_r($related_posts, true)); внутри фильтра.

Частые ошибки и как их исправить

  • Метод get_col возвращает пустой массив: Проверьте, что мета-поле точно добавлено, и в базе есть запись с нужным ключом и значением.
  • Ошибка при подготовке запроса: Убедитесь, что количество плейсхолдеров совпадает с количеством передаваемых параметров.
  • Связанные товары не обновляются: Очистите кэш WooCommerce и кэш сайта (если есть). Также проверьте, что фильтр не конфликтует с другими плагинами.

Практические советы по безопасности и производительности

  • Используйте прямые SQL-запросы с осторожностью, обязательно применяйте $wpdb->prepare() для защиты от SQL-инъекций.
  • Кешируйте результаты запроса, если блок связанных товаров выводится часто, чтобы снизить нагрузку на базу.
  • Если у вас большой каталог, рассмотрите добавление индексов на мета-ключи для ускорения выборки.

Сравнение вариантов реализации исключения товаров из связанных

МетодПлюсыМинусы
Фильтр woocommerce_related_products с SQL-запросомГибкость, быстрое исключение на уровне выборкиТребует знаний SQL, возможны ошибки при неправильном запросе
Удаление товаров из массива связанных в PHP без SQLПростота реализации, не требует прямых запросовМожет быть медленнее на больших списках, нагрузка на PHP
Использование сторонних плагинов для кастомизации связанныхГотовые решения, интерфейс для настройкиПотенциальные конфликты, дополнительная нагрузка, не всегда гибко

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

⭐⭐⭐⭐⭐
WooCommerce: как исключить товары по метаданным из списка связанных товаров
15.05.2026
Как создать свой плагин для автоматического создания связанных записей в WordPress
18.11.2025
WooCommerce: как исключить товары по метаданным из списка связанных товаров
30.04.2026
Как эффективно использовать YARPP с AJAX: динамическая подгрузка связанных записей в WordPress
12.04.2026
WooCommerce: как исключить товары по метаданным из списка связанных товаров
07.05.2026
×
-15%
на премиум плагин
Clearfy

Защитите сайт!

Включить Clearfy »