Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Оглавление

Подмена шаблонов

Шаблон — PHP-файл с разметкой одного блока страницы: цены, корзины, письма. Шаблоны WooCommerce лежат в wp-content/plugins/woocommerce/templates/. Когда хуков не хватает и нужно изменить саму разметку, файл копируют в тему и правят копию — оригинал остаётся нетронутым.

Как WooCommerce ищет шаблон

Перед выводом блока плагин сначала проверяет папку woocommerce в активной теме. Нашёл файл с тем же путём — использует его, не нашёл — берёт свой.

Исходный файл в woocommerce/templates/Копия в теме
single-product/short-description.phpacme-child/woocommerce/single-product/short-description.php
cart/cart.phpacme-child/woocommerce/cart/cart.php
emails/customer-processing-order.phpacme-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 до них не доходят, и корзина или оформление заказа ломаются. Копируйте только тот файл, который действительно меняете.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.