Диагностика задачи: зачем выводить товары по категориям вручную?
Часто стандартные шорткоды WooCommerce, например [products category="slug"], не дают нужной гибкости для вывода товаров по категориям. Нужно кастомное решение, чтобы контролировать разметку, количество выводимых товаров, сортировку и интегрировать вывод в шаблоны темы или виджеты без сторонних плагинов.
Пошаговое решение: создание кастомного вывода товаров по категориям
1. Получение товаров из категории с помощью WP_Query
Для вывода товаров по категориям используем класс WP_Query с параметрами таксономии product_cat. Пример кода для вывода 8 товаров из категории с ярлыком novinki:
function wpsell_show_products_by_category( $category_slug, $posts_per_page = 8 ) {
$args = array(
'post_type' => 'product',
'posts_per_page' => $posts_per_page,
'tax_query' => array(
array(
'taxonomy' => 'product_cat',
'field' => 'slug',
'terms' => $category_slug,
),
),
'orderby' => 'date',
'order' => 'DESC',
);
$query = new WP_Query( $args );
if ( $query->have_posts() ) {
echo '<ul class="wpsell-products-list">';
while ( $query->have_posts() ) {
$query->the_post();
global $product;
echo '<li>';
echo '<a href="' . get_the_permalink() . '">' . get_the_title() . '</a>';
echo '<span class="price">' . $product->get_price_html() . '</span>';
echo '</li>';
}
echo '</ul>';
wp_reset_postdata();
} else {
echo '<p>Товары не найдены в категории ' . esc_html( $category_slug ) . '.</p>';
}
}2. Использование функции в шаблонах и шорткоде
Чтобы удобно использовать вывод через редактор, добавим шорткод:
add_shortcode( 'wpsell_products_cat', function( $atts ) {
$atts = shortcode_atts( array(
'category' => '',
'limit' => 8,
), $atts, 'wpsell_products_cat' );
ob_start();
if ( ! empty( $atts['category'] ) ) {
wpsell_show_products_by_category( sanitize_text_field( $atts['category'] ), intval( $atts['limit'] ) );
} else {
echo '<p>Укажите категорию товаров в атрибуте category.</p>';
}
return ob_get_clean();
});Теперь можно вывести товары из категории novinki в любом месте сайта с помощью шорткода:
[wpsell_products_cat category="novinki" limit="6"]Проверка результата после внедрения
1. Добавьте код в файл functions.php вашей дочерней темы или в site-specific плагин.
2. Вставьте шорткод с нужной категорией в любую запись или страницу.
3. Убедитесь, что на странице появились товары из выбранной категории с заголовком и ценой.
4. Если товары не отображаются, проверьте, что категория существует и содержит товары.
5. Включите режим отладки WordPress (WP_DEBUG) для выявления ошибок.
Частые ошибки и как исправить
- Неверный слаг категории
Проверьте, чтоcategory_slugсовпадает с ярлыком категории товара. Ошибка приведет к пустому результату. - Отсутствие товаров в категории
Убедитесь, что в категории есть опубликованные товары со статусом «опубликовано». - Код вставлен в неподходящее место
Код лучше размещать в файлах темы или плагина, не в php-файлах плагинов WooCommerce, чтобы избежать потери при обновлении. - Пропущен вызов
wp_reset_postdata()
Без него могут сломаться другие циклы на странице.
Практические советы по безопасности и производительности
- Используйте
sanitize_text_field()для очистки входящих параметров шорткода. - Ограничивайте количество выводимых товаров (
posts_per_page) для снижения нагрузки на сервер. - Кешируйте результаты вывода с помощью transient API, если список меняется нечасто.
- Не выводите слишком много данных (например, весь контент), чтобы не замедлять загрузку.
- Используйте стили и классы CSS для адаптивного и аккуратного отображения списка.
Сравнение вариантов вывода товаров по категориям
| Метод | Плюсы | Минусы |
|---|---|---|
Стандартный шорткод WooCommerce[products category="slug"] | Просто вставить, не требует кода Поддерживается WooCommerce | Ограниченная кастомизация Зависит от настроек темы и плагинов |
| Кастомный WP_Query в коде (как в статье) | Полный контроль над выводом Легко интегрировать в шаблоны Можно добавлять кастомные поля и оформление | Требует навыков PHP Необходима проверка безопасности и производительности |
| Плагины для вывода товаров по категориям | Готовые решения с визуальным редактором Дополнительный функционал (фильтры, ajax) | Могут замедлить сайт Зависимость от стороннего кода Не всегда бесплатны |