Диагностика проблемы: почему нужно исключать товары из связанных
В 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 |
| Использование сторонних плагинов для кастомизации связанных | Готовые решения, интерфейс для настройки | Потенциальные конфликты, дополнительная нагрузка, не всегда гибко |