WordPress · 7 мин чтения

footer.php WordPress: как править подвал темы и не потерять правки при обновлении

Если вы открыли footer.php WordPress, поменяли там копирайт, а через месяц после обновления темы увидели старый подвал, то правили файл не в том месте. Родительская тема при обновлении перезаписывается целиком, и любая ваша правка внутри её папки исчезает. Ниже я показываю, где лежит подвал, как вынести правки в дочернюю тему, когда файл вообще не нужен и что делать, если тема блочная.

В классической теме подвал это файл footer.php в корне папки темы, то есть wp-content/themes/имя-темы/footer.php. Его вызывает функция get_footer() в конце шаблонов index.php, page.php, single.php и остальных. Если в шаблоне вызов get_footer() пропущен, подвал на странице не появится.

В типичном footer.php есть три обязательные вещи: закрытие контейнеров, которые открыл header.php, вывод самого подвала и вызов wp_footer() прямо перед закрывающим </body>. Последний вызов самый важный. Именно через него плагины и тема подключают свои скрипты, а админ-панель наверху сайта для залогиненного пользователя без него не выводится. Если вы вырезали wp_footer() при чистке разметки, ломаются слайдеры, всплывающие окна и корзина WooCommerce, причём ошибок в логе вы не увидите.

У get_footer() есть необязательный аргумент. Вызов get_footer( 'shop' ) подключит файл footer-shop.php, а если такого файла нет, WordPress вернётся к обычному footer.php. Это удобно, когда у магазина должен быть один подвал, а у блога другой.

Порядок поиска шаблонов в WordPress многоступенчатый: сначала система ищет файл в дочерней теме, потом в родительской. Эта логика нужна нам дальше.

Почему правки в родительской теме пропадают

Обновление темы заменяет её папку новой версией. Файлы, которых нет в архиве, могут остаться, но footer.php есть в любой классической теме, поэтому он будет перезаписан. Я сталкивался с этим на сайте, где подрядчик до меня вписал реквизиты юрлица прямо в родительский footer.php. После планового обновления реквизиты пропали, а для интернет-магазина с оплатой через T‑Bank в WooCommerce это неприятно: банк проверяет наличие реквизитов и условий на сайте.

Способов сохранить правки несколько, и они сильно различаются по надёжности:

Способ Переживёт обновление темы Нужен доступ к файлам Когда подходит
Правка родительского footer.php Нет Да Только на разовом тестовом сайте
Копия footer.php в дочерней теме Да Да Меняется разметка подвала
Хук wp_footer в дочерней теме или плагине Да Да Нужно добавить скрипт или блок, разметка остаётся родная
Подвал в редакторе сайта (блочные темы) Да, хранится в базе Нет Тема блочная

Первый способ я не использую вообще, даже «на минутку». Минутка превращается в годы, а о правке все забывают.

Бесплатный материал

🎁 Полезный скрипт в подарок

Подпишитесь на Telegram - пришлю готовый скрипт по этой теме.

Без спама. Отписка в 1 клик.

Дочерняя тема это отдельная папка рядом с родительской. В ней достаточно двух файлов: style.css с заголовком и functions.php. Всё остальное WordPress берёт из родителя, пока вы не положили в дочернюю тему файл с тем же именем.

Создаём каркас

Создайте папку рядом с родительской, например wp-content/themes/astra-child, и положите в неё style.css. Строка Template обязана совпадать с именем папки родительской темы, иначе тема не активируется:

/*
 Theme Name: Astra Child
 Template: astra
 Version: 1.0
*/

Теперь functions.php. Подключаем стили родителя и дочерней темы:

<?php
add_action( 'wp_enqueue_scripts', function () {
    wp_enqueue_style( 'parent-style', get_template_directory_uri() . '/style.css' );
    wp_enqueue_style( 'child-style', get_stylesheet_uri(), array( 'parent-style' ) );
} );

У части тем, включая Astra, основные стили подключаются своим способом, и родительский style.css почти пуст. Вреда от такого подключения нет, но проверьте в браузере, что дочерние стили действительно применяются.

После этого активируйте дочернюю тему в разделе «Внешний вид, Темы». Настройки меню и виджетов у некоторых тем привязаны к конкретной теме, поэтому после переключения их иногда приходится проверить заново.

Копируем и правим footer.php

Скопируйте footer.php из родительской темы в папку дочерней и правьте уже копию. С этого момента WordPress берёт подвал из дочерней темы, а обновления родителя его не затрагивают. Минимальный рабочий вариант подвала с копирайтом, который сам меняет год:

<footer id='colophon' class='site-footer'>
    <div class='footer-inner'>
        <p>&copy; <?php echo esc_html( wp_date( 'Y' ) ); ?> <?php bloginfo( 'name' ); ?></p>
        <p><a href='<?php echo esc_url( get_privacy_policy_url() ); ?>'>Политика конфиденциальности</a></p>
    </div>
</footer>
<?php wp_footer(); ?>
</body>
</html>

Это пример структуры. В реальной теме начало файла обычно закрывает контейнеры, открытые в header.php, и эти теги надо оставить как в оригинале. Поэтому я всегда копирую родительский файл целиком и меняю только нужный кусок, а не пишу подвал с нуля.

Один минус у такого подхода есть. Если разработчик темы позже изменит собственный footer.php, например добавит новую разметку или хук, ваша копия этого не получит. После крупных обновлений темы я сравниваю родительский и дочерний файлы построчно, в любом редакторе есть режим сравнения.

Часто в подвал нужно добавить совсем немного: код счётчика, чат-виджет, скрипт аналитики. Копировать ради этого весь footer.php избыточно. Хук wp_footer срабатывает внутри вызова wp_footer(), и в него можно вывести свой код из functions.php дочерней темы:

add_action( 'wp_footer', function () {
    ?>
    <script>
        // сюда вставляется код счётчика или виджета
    </script>
    <?php
}, 20 );

Третий аргумент add_action это приоритет, по умолчанию он равен 10. Чем число больше, тем позже сработает ваш код относительно остальных обработчиков этого хука. Для скриптов, зависящих от jQuery или других библиотек, лучше подключать их через wp_enqueue_script() с параметром in_footer, а хук wp_footer оставлять для готовой разметки и коротких инлайн-вставок.

Если код нужен независимо от темы (счётчик должен жить, даже когда вы сменили дизайн), оформите его как маленький плагин или положите в плагин для сниппетов. Тогда смена темы не потеряет скрипт. На сайтах клиентов я так делаю с аналитикой: тема меняется раз в несколько лет, счётчик должен работать всё это время.

Ещё одна практическая мелочь: на странице корзины и оформления заказа в WooCommerce лишние скрипты в подвале замедляют загрузку формы оплаты. Условие вида if ( is_checkout() ) return; в начале коллбека отключает вашу вставку на этой странице. Функция is_checkout() есть в WooCommerce, поэтому проверяйте, что плагин активен, или оберните вызов в function_exists.

В блочных темах файла footer.php нет. Подвал там это часть шаблона, обычно файл parts/footer.html, и менять его удобнее в редакторе сайта через «Внешний вид, Редактор». Иерархия шаблонов в блочных темах та же, что в классических, только вместо PHP-файлов используются HTML-файлы.

Есть важная особенность хранения. Когда вы редактируете подвал в редакторе и сохраняете, правка записывается в базу данных как пользовательский шаблон. Файл темы остаётся прежним, а приоритет у пользовательской версии выше. Поэтому обновление темы такую правку не стирает, и дочерняя тема для подвала не требуется. Дочерняя тема в блочной схеме нужна, когда вы хотите хранить изменения в файлах, например чтобы переносить их через git между окружениями.

Обратная сторона: правка в базе не видна при просмотре файлов темы и теряется при переносе сайта, если вы перенесли только файлы. Я всегда проверяю после миграции, что подвал выглядит так же, как на старом сайте, потому что на таких сайтах он часто собран в редакторе и «не лежит» ни в одной папке.

Типичные ошибки при правке подвала

  • Правка прямо на боевом сайте через редактор файлов. В разделе «Внешний вид, Редактор файлов темы» опечатка в PHP даёт белый экран на всём сайте. Перед правкой я делаю копию файла, а на постоянной основе отключаю этот редактор константой DISALLOW_FILE_EDIT в wp-config.php. Это ещё и закрывает одну из лазеек при взломе админки.
  • Удалён wp_footer(). Симптомы описаны выше: пропадают скрипты плагинов, выглядит как «глючит всё сразу». Если после правки подвала что-то сломалось, первым делом ищите этот вызов.
  • Текст ссылок и год вписаны руками. Копирайт с зашитым годом устаревает ровно в январе. Используйте wp_date( 'Y' ), как в примере выше.
  • Нет проверки на копии сайта. Любую правку шаблона я сначала запускаю на тестовой копии, особенно если сайт принимает оплату. Опечатка в подвале магазина в пятницу вечером стоит заказов.
  • Кэш. После правки подвал в браузере может остаться старым из-за плагина кэширования или CDN. Очистите кэш, прежде чем решать, что правка не сработала.

Если заниматься этим некогда, правки шаблонов можно передать мне в рамках техподдержки сайта: я меняю подвал в дочерней теме, проверяю на копии и сверяю с родительской темой после обновлений.

WordPress и сторонние темы регулярно обновляются, поэтому перед внедрением правок я сверяюсь с актуальной документацией WordPress и самой темы.

Частые вопросы

Можно ли править footer.php в родительской теме, если я не буду её обновлять?

Технически да, но отказ от обновлений означает, что вы остаётесь без исправлений безопасности темы. Это риск для сайта, и он обычно дороже, чем создание дочерней темы. Дочерняя тема делается один раз, дальше обновления можно ставить спокойно.

Почему после копирования footer.php в дочернюю тему ничего не изменилось?

Чаще всего дело в трёх вещах: дочерняя тема не активирована, строка Template в style.css не совпадает с именем папки родителя, либо тема использует собственные хуки и выводит подвал не через footer.php. Проверьте активную тему в админке и попробуйте поставить в копию файла заметный текст, чтобы убедиться, что она подхватывается. Не забудьте и про очистку кэша.

Где править подвал, если в теме нет файла footer.php?

Скорее всего, тема блочная. Откройте «Внешний вид, Редактор», выберите часть шаблона с подвалом и правьте её там. Изменения сохранятся в базе и не пропадут при обновлении темы.

Куда вставить код счётчика, чтобы не копировать весь подвал?

В functions.php дочерней темы через add_action( 'wp_footer', ... ) или в отдельный плагин, если счётчик должен пережить смену темы. Главное, чтобы в используемом шаблоне вызывался wp_footer(), иначе хук не сработает.

Есть задача?

Обсудим в мессенджере

Расскажите, что нужно сделать — отвечу в течение 4 часов в рабочее время. Первая консультация бесплатно.

Продолжая пользование настоящим сайтом Вы выражаете своё согласие на обработку Ваших персональных данных (файлов куки) с использованием Yandex.Metrika.
Понятно