Подмена шаблонов
Шаблон — PHP-файл с разметкой одного блока страницы: цены, корзины, письма. Шаблоны WooCommerce лежат в wp-content/plugins/woocommerce/templates/. Когда хуков не хватает и нужно изменить саму разметку, файл копируют в тему и правят копию — оригинал остаётся нетронутым.
Как WooCommerce ищет шаблон
Перед выводом блока плагин сначала проверяет папку woocommerce в активной теме. Нашёл файл с тем же путём — использует его, не нашёл — берёт свой.
Исходный файл в woocommerce/templates/ | Копия в теме |
|---|---|
single-product/short-description.php | acme-child/woocommerce/single-product/short-description.php |
cart/cart.php | acme-child/woocommerce/cart/cart.php |
emails/customer-processing-order.php | acme-child/woocommerce/emails/customer-processing-order.php |
Слово templates в пути копии не повторяется.
Подмена шаблона
Скопируйте short-description.php в дочернюю тему — папки woocommerce/single-product создайте вручную — и измените разметку:
<!-- wp-content/themes/acme-child/woocommerce/single-product/short-description.php -->
<?php
defined('ABSPATH') || exit;
global $post;
$short_description = apply_filters('woocommerce_short_description', $post->post_excerpt);
if (!$short_description) {
return;
}
?>
<div class="woocommerce-product-details__short-description acme-box">
<h3>Коротко о товаре</h3>
<?php echo $short_description; ?>
</div>Откройте страницу товара с заполненным кратким описанием: над текстом появился заголовок «Коротко о товаре». Настоящий файл начинается с <?php и комментария с номером версии — их оставляют как есть.
Свой шаблон в плагине
Разметку собственных блоков тоже выносят в шаблон. Создайте файл templates/single-product/lead-time.php в плагине:
<!-- wp-content/plugins/acme-shop/templates/single-product/lead-time.php -->
<p class="acme-lead-time">
Изготовим за <strong><?php echo esc_html($days); ?></strong> дн.
</p>И выведите его функцией wc_get_template() вместо printf() из прошлой главы:
// wp-content/plugins/acme-shop/includes/storefront.php
add_action('woocommerce_single_product_summary', function () {
global $product;
$days = (int) $product->get_meta('_acme_lead_time');
if ($days > 0) {
wc_get_template(
'single-product/lead-time.php',
['days' => $days],
'',
dirname(__DIR__) . '/templates/'
);
}
}, 25);Первый аргумент — путь шаблона, второй — переменные, которые будут доступны внутри, четвёртый — папка, где шаблон лежит по умолчанию. Страница товара выглядит по-прежнему, но теперь тема может подменить и этот файл копией acme-child/woocommerce/single-product/lead-time.php.
Устаревшие копии
В начале каждого шаблона WooCommerce стоит номер версии: @version 9.4.0. Когда плагин обновляет шаблон, номер растёт, а копия в теме остаётся старой. Список таких копий показывает страница «WooCommerce → Статус», раздел «Шаблоны»: рядом с файлом написано, какая версия у темы и какая у плагина.
Обновляют копию вручную: берут новый исходный файл, переносят в него свои правки и сохраняют поверх старого.
Когда хук, когда шаблон
| Задача | Чем решать |
|---|---|
| Добавить, убрать, переставить блок | Хуком |
| Изменить текст или значение | Фильтром |
| Изменить HTML-разметку блока | Копией шаблона |
Частая ошибка
В тему копируют всю папку templates «на всякий случай». Магазин начинает использовать десятки замороженных файлов: исправления и новые поля из обновлений WooCommerce до них не доходят, и корзина или оформление заказа ломаются. Копируйте только тот файл, который действительно меняете.