Диагностика проблемы: почему связаны товары отображаются некорректно
В WooCommerce к связанным товарам относятся upsells, cross-sells и related products. Часто пользователи замечают, что эти товары отображаются не те, которые хотелось бы, либо вообще не появляются, несмотря на настройку товаров. Это происходит из-за автоматического алгоритма WooCommerce, который подбирает related products на основе категорий и тегов, а upsells и cross-sells — на основе настроек в карточке товара.
Проверить, какие товары связаны с вашим товаром, можно в админке в разделе редактирования товара во вкладках «Связанные товары» (Upsells, Cross-sells).
Пошаговое решение: удаление или кастомизация связанных товаров программно
Удаление отображения связанных товаров на странице товара
Чтобы полностью убрать блок related products, добавьте в functions.php вашей темы следующий код:
remove_action('woocommerce_after_single_product_summary', 'woocommerce_output_related_products', 20);Это удалит вывод блока связанных товаров. Аналогично можно убрать upsells и cross-sells:
remove_action('woocommerce_after_single_product_summary', 'woocommerce_upsell_display', 15);Изменение набора связанных товаров с помощью фильтра
Для более точного контроля WooCommerce предоставляет фильтр woocommerce_related_products, который позволяет задать ID товаров вручную или изменить выборку.
Пример кода для замены списка связанных товаров на определённые ID:
add_filter('woocommerce_related_products', 'custom_related_products', 10, 3);
function custom_related_products($related_posts, $product_id, $args) {
// Задаём свои ID товаров
$custom_related = array(34, 56, 78);
return $custom_related;
}Этот код заменит автоматическую выборку на товары с ID 34, 56 и 78.
Настройка upsells и cross-sells через код
Если нужно программно добавить или удалить upsells или cross-sells, можно использовать функции WordPress для обновления метаданных:
// Добавить upsell
update_post_meta($product_id, '_upsell_ids', array(12, 15));
// Удалить все cross-sells
update_post_meta($product_id, '_crosssell_ids', array());Где $product_id — ID товара, а числа в массивах — ID связанных товаров.
Проверка результата после внедрения
- Очистите кэш сайта и браузера.
- Откройте страницу товара и убедитесь, что блоки связанных товаров либо отсутствуют (если удаляли), либо отображают корректные товары.
- Для проверки обновления upsells/cross-sells можно временно вывести их ID в шаблоне или использовать дебаг с
var_dump.
Частые ошибки и как их исправить
- Не виден эффект после удаления блока related products: возможно, тема или плагин переопределяют шаблоны WooCommerce. Проверьте наличие
woocommerce/single-product/related.phpв вашей теме. - Код в
functions.phpне срабатывает: убедитесь, что код добавлен в активную тему, нет синтаксических ошибок, и используете правильные хуки. - Связанные товары не обновляются после изменения метаданных: проверьте наличие кэша WooCommerce и плагинов кэширования, очистите кэш.
Практические советы для производительности и поддержки
- Удаление блоков связанных товаров снижает нагрузку на запросы к базе, особенно если на сайте много товаров.
- Если требуется сложная кастомизация связей, лучше реализовать собственную логику через фильтры, а не менять шаблоны, чтобы сохранить совместимость с обновлениями WooCommerce.
- Для безопасности не редактируйте ядро WooCommerce — используйте хуки и фильтры.
Сравнение способов управления связанными товарами
| Метод | Плюсы | Минусы | Пример |
|---|---|---|---|
Удаление блоков через remove_action | Простота и скорость | Полная потеря функционала связанных товаров | remove_action('woocommerce_after_single_product_summary', 'woocommerce_output_related_products', 20); |
Кастомизация через фильтр woocommerce_related_products | Полный контроль над выводом | Требует знаний PHP и WooCommerce API | Фильтр с возвратом массива ID товаров |
| Редактирование метаданных upsells/cross-sells | Изменение связей без изменения шаблонов | Нужен код для каждой операции, сложнее в массовом управлении | update_post_meta($product_id, '_upsell_ids', array(...)); |