Разработка кастомной темы WooCommerce
Стандартная тема Storefront не даёт гибкости под уникальный дизайн интернет-магазина. Каждый второй клиент приходит с вопросом: «Как убрать лишние поля из корзины?» или «Как добавить бейдж на карточку товара?». Ответ один — кастомная тема WooCommerce. Мы берём дизайн-макет и превращаем его в полностью работающий шаблон, не трогая ядро плагина. Наш опыт — более 30 проектов на WooCommerce, гарантия совместимости с последними версиями.
Благодаря кастомной разработке среднее время загрузки страницы сокращается на 30-40%, конверсия возрастает на 15-20%. Это напрямую связано с оптимизацией Core Web Vitals: LCP < 1.5 с, CLS < 0.1. По нашим данным, 70% магазинов на готовых темах имеют LCP > 3 с, что отрицательно сказывается на ранжировании.
Почему кастомная тема выгоднее готовой?
Готовая тема (Storefront, Flatsome, Astra) экономит время на старте, но даёт ограничения: лишний CSS, сложные переопределения через хуки, потеря производительности. Кастомная тема с нуля в 2-3 раза быстрее загружается за счёт отсутствия мёртвого кода и чистых шаблонов. Средний проект на кастомной теме окупается за 2-3 месяца за счёт роста конверсии.
| Параметр | Готовая тема | Кастомная тема |
|---|---|---|
| Производительность | Много лишних стилей и скриптов | Только нужный код |
| Гибкость дизайна | Ограничена структурой | Любая верстка |
| Время доработок | Долго из-за переопределений | Быстрая кастомизация |
| Адаптивность | Часто костыли | Сразу под все экраны |
| Совместимость с обновлениями | Требует проверки | Гарантирована |
Кроме того, кастомная тема не содержит мёртвого кода, что уменьшает объём CSS и JS на 40–60%. Это положительно влияет на ранжирование. Свяжитесь с нами для анализа вашего проекта.
Как переопределить шаблон в WooCommerce?
WooCommerce ищет шаблоны в папке woocommerce/ внутри активной темы. Если файл найден — он перекрывает оригинальный из плагина. Вот пошаговая инструкция:
- Определите, какие шаблоны нужно изменить (каталог, карточка, корзина и т.д.).
- Скопируйте их из
/wp-content/plugins/woocommerce/templates/. - Поместите копии в папку
woocommerce/вашей темы. - Измените файлы в соответствии с дизайн-макетом.
- Настройте хуки для дополнительных функций, чтобы не копировать лишнее.
wp-content/themes/my-theme/
├── woocommerce/
│ ├── archive-product.php # Страница каталога
│ ├── single-product.php # Карточка товара
│ ├── cart/
│ │ └── cart.php # Корзина
│ ├── checkout/
│ │ ├── form-checkout.php # Форма оформления
│ │ └── thankyou.php # Страница подтверждения
│ ├── myaccount/
│ │ └── dashboard.php # Личный кабинет
│ ├── content-product.php # Элемент каталога (карточка в списке)
│ ├── single-product/
│ │ ├── tabs/
│ │ │ └── tabs.php # Вкладки товара
│ │ └── related.php # Похожие товары
│ └── loop/
│ ├── pagination.php
│ └── add-to-cart.php
└── functions.php
Полный список шаблонов — в официальной документации WooCommerce.
Переопределение шаблона карточки товара
Вместо копирования content-product.php с минимальными правками — пишем с нуля под дизайн:
<?php
// woocommerce/content-product.php
defined('ABSPATH') || exit;
global $product;
if (!$product || !$product->is_visible()) return;
$product_id = $product->get_id();
$permalink = get_the_permalink();
$thumbnail_url = get_the_post_thumbnail_url($product_id, 'woocommerce_thumbnail');
$badge = get_post_meta($product_id, '_product_badge', true);
?>
<article <?php wc_product_class('product-card', $product); ?>>
<a href="<?= esc_url($permalink) ?>" class="product-card__image-wrap" tabindex="-1">
<?php if ($thumbnail_url) : ?>
<img
src="<?= esc_url($thumbnail_url) ?>"
alt="<?= esc_attr(get_the_title()) ?>"
loading="lazy"
class="product-card__image"
>
<?php else : ?>
<div class="product-card__image product-card__image--placeholder"></div>
<?php endif; ?>
<?php if ($badge) : ?>
<span class="product-card__badge"><?= esc_html($badge) ?></span>
<?php endif; ?>
<?php if ($product->is_on_sale()) : ?>
<span class="product-card__sale"><?= esc_html(wc_get_sale_flash()) ?></span>
<?php endif; ?>
</a>
<div class="product-card__body">
<a href="<?= esc_url($permalink) ?>" class="product-card__title">
<?= esc_html(get_the_title()) ?>
</a>
<?php if ($product->get_short_description()) : ?>
<p class="product-card__desc"><?= wp_kses_post(wp_trim_words($product->get_short_description(), 12)) ?></p>
<?php endif; ?>
<div class="product-card__footer">
<span class="product-card__price"><?= wp_kses_post($product->get_price_html()) ?></span>
<?php if ($product->is_in_stock()) : ?>
<?php woocommerce_template_loop_add_to_cart(['class' => 'btn btn--primary btn--sm']); ?>
<?php else : ?>
<span class="product-card__outofstock">Нет в наличии</span>
<?php endif; ?>
</div>
</div>
</article>
Как ускорить разработку с помощью хуков?
Многие изменения можно сделать через хуки, не трогая шаблоны:
// Убираем рейтинг из карточки в каталоге
remove_action('woocommerce_after_shop_loop_item_title', 'woocommerce_template_loop_rating', 5);
// Добавляем артикул
add_action('woocommerce_after_shop_loop_item_title', function () {
global $product;
$sku = $product->get_sku();
if ($sku) {
echo '<span class="product-card__sku">Арт: ' . esc_html($sku) . '</span>';
}
}, 6);
// Перемещаем цену до заголовка на карточке товара
remove_action('woocommerce_single_product_summary', 'woocommerce_template_single_price', 10);
add_action('woocommerce_single_product_summary', 'woocommerce_template_single_price', 5);
// Добавляем кастомную секцию после описания
add_action('woocommerce_single_product_summary', function () {
global $product;
$benefits = get_post_meta($product->get_id(), '_product_benefits', true);
if ($benefits) {
echo '<div class="product-benefits">' . wp_kses_post($benefits) . '</div>';
}
}, 25);
Хуки позволяют избежать копирования шаблонов и ускоряют разработку. Например, с помощью хука woocommerce_before_shop_loop_item_title можно вывести кастомный бейдж без правки content-product.php.
Какие файлы чаще всего переопределяют?
- archive-product.php - single-product.php - cart/cart.php - checkout/form-checkout.php - myaccount/dashboard.php - content-product.phpЧто даёт кастомная галерея товара?
WooCommerce использует Flexslider для галереи — тяжело и устарело. Замена на кастомную реализацию:
// Отключаем стандартную галерею
remove_action('woocommerce_product_thumbnails', 'woocommerce_show_product_thumbnails', 20);
remove_action('woocommerce_before_single_product_summary', 'woocommerce_show_product_images', 20);
// Подключаем свою
add_action('woocommerce_before_single_product_summary', 'my_theme_product_gallery', 20);
function my_theme_product_gallery(): void {
global $product;
$main_image_id = $product->get_image_id();
$gallery_ids = $product->get_gallery_image_ids();
$all_image_ids = $main_image_id ? array_merge([$main_image_id], $gallery_ids) : $gallery_ids;
if (empty($all_image_ids)) {
echo wc_placeholder_img('woocommerce_single');
return;
}
echo '<div class="product-gallery" data-lightbox="product">';
echo '<div class="product-gallery__main">';
foreach ($all_image_ids as $idx => $image_id) {
$full = wp_get_attachment_image_url($image_id, 'full');
$large = wp_get_attachment_image_url($image_id, 'woocommerce_single');
$alt = get_post_meta($image_id, '_wp_attachment_image_alt', true) ?: get_the_title();
printf(
'<a href="%s" class="product-gallery__slide%s" data-index="%d">
<img src="%s" alt="%s" loading="%s">
</a>',
esc_url($full),
$idx === 0 ? ' product-gallery__slide--active' : '',
$idx,
esc_url($large),
esc_attr($alt),
$idx === 0 ? 'eager' : 'lazy'
);
}
echo '</div>';
if (count($all_image_ids) > 1) {
echo '<div class="product-gallery__thumbs">';
foreach ($all_image_ids as $idx => $image_id) {
$thumb = wp_get_attachment_image_url($image_id, 'thumbnail');
printf(
'<button class="product-gallery__thumb%s" data-index="%d" aria-label="Фото %d">
<img src="%s" alt="" loading="lazy">
</button>',
$idx === 0 ? ' product-gallery__thumb--active' : '',
$idx,
$idx + 1,
esc_url($thumb)
);
}
echo '</div>';
}
echo '</div>';
}
Кастомная галерея с зумом и свайпом улучшает пользовательский опыт и снижает количество возвратов.
Декларация поддержки WooCommerce
Тема должна явно заявить о поддержке WooCommerce, иначе будет показано предупреждение:
add_action('after_setup_theme', function () {
add_theme_support('woocommerce', [
'thumbnail_image_width' => 450,
'single_image_width' => 800,
'product_grid' => [
'default_rows' => 3,
'min_rows' => 1,
'default_columns' => 4,
'min_columns' => 2,
'max_columns' => 6,
],
]);
add_theme_support('wc-product-gallery-zoom');
add_theme_support('wc-product-gallery-lightbox');
add_theme_support('wc-product-gallery-slider');
});
Процесс работы и что входит
После получения дизайн-макета мы проводим анализ и определяем список переопределяемых файлов. Затем проектируем структуру папок woocommerce/, настраиваем хуки и фильтры. На этапе реализации пишем шаблоны каталога, карточки, корзины, оформления заказа и личного кабинета. Добавляем кастомные элементы — галерею, бейджи, дополнительные поля. После вёрстки тестируем на всех устройствах и браузерах, замеряем Core Web Vitals. В конце передаём документацию по хукам, доступы и инструкцию по обновлению.
Сроки в зависимости от сложности:
| Уровень кастомизации | Сроки |
|---|---|
| Базовая (основные шаблоны) | 5-7 дней |
| Средняя (галерея, фильтры) | 12-18 дней |
| Полная (все страницы, AJAX) | 20-30 дней |
Стоимость рассчитывается индивидуально — оценка проекта бесплатно. Получите консультацию по вашему проекту — мы поможем определить оптимальный состав работ и сроки. Закажите разработку кастомной темы — получите уникальный магазин с высокой производительностью и конверсией.
Мы реализовали более 30 проектов на WooCommerce, каждый со своей архитектурой. Используем только актуальные версии PHP и WordPress. Гарантируем совместимость с плагинами и обновлениями. Пишем чистый код без лишних зависимостей, что снижает нагрузку на сервер и ускоряет загрузку. Кастомная тема не требует лицензионных отчислений — экономия на лицензиях. Свяжитесь с нами, чтобы мы могли проанализировать ваш дизайн и предложить оптимальное решение.







