В чем суть задачи: связанные товары в WooCommerce
Связанные товары (related products) — это стандартный функционал WooCommerce, который выводит товары из той же категории или с похожими атрибутами. Однако стандартная реализация не всегда устраивает: она может показывать нерелевантные товары, а для уникальных сценариев нужно вывести товары, связанные не по категориям, а по кастомной логике. В этой статье разберем, как вывести связанные товары без использования дополнительных плагинов, используя стандартные хуки и WP_Query.
Диагностика проблемы: почему стандартные связанные товары не подходят
По умолчанию WooCommerce выводит связанные товары через функцию wc_get_related_products(), которая выбирает товары из тех же категорий или тегов. Если ваша задача:
- Вывести товары, связанные по кастомному метаполю (например, "похожие по бренду" или "аксессуары"),
- Изменить количество или сортировку связанных товаров,
- Полностью контролировать вывод блока связанных товаров,
стандартный функционал не подойдет. Попытка просто изменить шаблон связанного товара через related.php даст лишь частичный контроль.
Пошаговое решение: кастомный вывод связанных товаров через WP_Query
1. Отключаем стандартный вывод связанных товаров
remove_action('woocommerce_after_single_product_summary', 'woocommerce_output_related_products', 20);Добавьте этот код в файл functions.php вашей дочерней темы или в кастомный плагин. Это отключит стандартный блок.
2. Создаем функцию для вывода кастомных связанных товаров
Допустим, у каждого товара есть метаполе _related_brand с ID бренда. Выведем товары с таким же брендом.
function hueman_custom_related_products() {
global $product;
if ( ! $product ) return;
$brand_id = get_post_meta( $product->get_id(), '_related_brand', true );
if ( ! $brand_id ) return;
$args = array(
'post_type' => 'product',
'posts_per_page' => 4,
'post__not_in' => array( $product->get_id() ),
'meta_query' => array(
array(
'key' => '_related_brand',
'value' => $brand_id,
'compare' => '=',
),
),
);
$related = new WP_Query( $args );
if ( $related->have_posts() ) {
echo '<section class="custom-related-products">';
echo '<h2>Похожие товары по бренду</h2>';
echo '<ul class="products">';
while ( $related->have_posts() ) {
$related->the_post();
wc_get_template_part( 'content', 'product' );
}
echo '</ul>';
echo '</section>';
}
wp_reset_postdata();
}
add_action('woocommerce_after_single_product_summary', 'hueman_custom_related_products', 20);3. Добавляем метаполе для товаров
Для примера в админке добавьте произвольное поле _related_brand с одинаковым значением у товаров, которые хотите связать (например, ID бренда или строку). Для массового редактирования используйте плагины типа Advanced Custom Fields или WP All Import.
Как проверить, что решение сработало
- Откройте страницу товара, у которого задано метаполе
_related_brand. - Внизу товара должен появиться блок "Похожие товары по бренду" с товарами, у которых совпадает метаполе.
- Убедитесь, что товар, на странице которого вы находитесь, не отображается в списке.
- Проверьте, что стандартный блок связанных товаров исчез (если он был до этого).
Частые ошибки и как их исправить
- Пустой блок связанных товаров: проверьте, что у товаров действительно есть метаполе и оно совпадает. Включите режим отладки WP_DEBUG для проверки ошибок.
- Ничего не меняется после добавления кода: убедитесь, что код добавлен в правильное место (functions.php дочерней темы или кастомного плагина) и нет синтаксических ошибок.
- Конфликты с другими плагинами: временно деактивируйте плагины, которые могут влиять на вывод товаров (кэш, оптимизация, кастомные шаблоны WooCommerce).
- Блок выводится, но стили нарушены: используйте классы WooCommerce
productsиproductдля элементов списка, чтобы сохранить стили темы.
Практические советы по производительности и безопасности
- Для ускорения запросов используйте кэширование результатов WP_Query, например с Transients API, если блок не требует мгновенного обновления.
- Не используйте пользовательский ввод напрямую в запросах без проверки — в наших примерах метаполе берется из базы, что безопасно.
- Если метаполе содержит сложные данные, рассмотрите возможность использования таксономий вместо метаполей — они индексируются лучше.
- Для больших магазинов ограничьте количество выводимых связанных товаров и используйте пагинацию или lazy load.
Сравнение подходов к выводу связанных товаров
| Метод | Плюсы | Минусы | Когда использовать |
|---|---|---|---|
| Стандартный WooCommerce | Простота, поддержка, обновления | Ограниченный контроль, нерелевантные товары | Мелкие магазины, базовые связи |
| Кастомный WP_Query с метаполями | Полный контроль, гибкость | Нужна разработка, возможны ошибки | Уникальная логика связей |
| Плагины связей (например, YITH WooCommerce) | Готовый функционал, UI в админке | Нагрузка, возможные конфликты | Без разработки, быстро |