Логотип seo-prodvizhenie-biznesa.ru
+7 (921) 333-77-45

Дочерняя тема WordPress: зачем нужна и как не потерять правки при обновлении

Дочерняя тема WordPress: зачем нужна и как не потерять правки при обновлении
Анатолий Кузнецов
Анатолий Кузнецов
SEO-оптимизатор с 20-летним стажем. Автор блога seo-prodvizhenie-biznesa.ru о продвижении и доработке сайтов.

Дочерняя тема WordPress решает ровно одну задачу: сохранить ваши правки, когда родительская тема обновится. Задача звучит скучно — ровно до того утра, когда вы открываете сайт после автообновления и видите в шапке старый телефон, вернувшийся из ниоткуда блок «Рекомендуем» и разъехавшуюся карточку товара. Файл, который правил подрядчик полгода назад, перезаписан оригиналом из архива разработчика. Восстановить неоткуда: копии нет, что именно меняли — никто уже не помнит.

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

Почему правка файлов темы напрямую всегда заканчивается одинаково

Тема в WordPress — это папка внутри wp-content/themes/ с набором файлов. Обновление темы не «дописывает изменения»: оно скачивает свежий архив и раскладывает файлы поверх старых. Всё, что вы дописали руками в functions.php, header.php или style.css родительской темы, исчезает вместе со старыми файлами. Документация WordPress говорит об этом прямо: быстрее всего вписать свою функцию в functions.php темы, но это плохая практика — при следующем обновлении функция пропадёт.

Дальше начинается второй круг. Владелец один раз потерял правки и решает: «значит, обновлять не буду». Через год у него тема двухлетней давности с незакрытыми дырами, несовместимая с текущей версией PHP, и любое обновление ядра рискует положить сайт целиком. Что именно ломается и в каком порядке обновлять — в отдельном материале о том, как обновить WordPress и не сломать сайт.

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

Как дочерняя тема подхватывает родительскую

Дочерняя тема — отдельная папка в wp-content/themes/, которая объявляет: «моя родительская тема лежит вот там». В документации сформулировано так: дочерняя тема по умолчанию включает в себя всё из родительской — и оформление, и функциональность. Вы её не копируете, вы её наследуете. Активна при этом дочерняя, а родительская просто остаётся установленной. Удалять её нельзя: наследовать будет нечего.

Дальше работает правило замещения. Документация перечисляет, что переопределяется файлом с тем же именем в дочерней теме: шаблоны, части шаблонов и паттерны. У паттернов есть оговорка — должно совпадать ещё и зарегистрированное поле Slug.

А functions.php ведёт себя иначе, и здесь ошибаются чаще всего. Цитирую документацию: в отличие от шаблонов и паттернов, functions.php дочерней темы не заменяет собой functions.php родительской — загружаются оба файла, причём дочерний непосредственно перед родительским. Отсюда прямое предупреждение, которое тоже есть в документации: не копируйте код из functions.php родительской темы в дочернюю, это приведёт к фатальным ошибкам из-за одинаковых имён функций. Если сайт уже в таком состоянии, порядок возврата — в разборе про критическую ошибку WordPress.

Ещё деталь, экономящая время на спорах: внучатых тем не бывает. Документация отвечает однозначно — в стандартной иерархии всего два уровня, родительская и дочерняя. У блочных тем поверх есть слой пользовательских настроек, который перекрывает theme.json, шаблоны и паттерны, но хранится он в базе данных, а не в файлах, и темой не является.

Из чего состоит минимальная дочерняя тема

Здесь инструкции в интернете обычно преувеличивают. По документации единственный абсолютно необходимый файл для существования дочерней темы — style.css. Остальное добавляется по необходимости.

Папка

Создаёте в wp-content/themes/ новую папку: латиницей, строчными, слова через дефис. Если родительская называется, условно, moya-tema, назовите дочернюю moya-tema-child — через год сами поймёте, что это.

style.css и заголовок Template

Внутри создаёте style.css. WordPress просматривает папки в wp-content/themes, у найденного style.css читает первые 8 килобайт и оттуда берёт данные темы из комментария в начале файла.

Минимально обязательное поле для любой темы — Theme Name. Для дочерней документация требует добавить ещё одно: Template. Его значение — имя папки родительской темы относительно wp-content/themes, и совпадать оно должно на сто процентов. Если родительская лежит в wp-content/themes/twentytwentyfour, значение Template — ровно twentytwentyfour, без пробелов, заглавных букв и красивого названия из админки.

Самая частая причина, по которой дочерняя тема «не видна» или ломает сайт при активации, — опечатка именно в этом поле. Имя папки и название темы в интерфейсе — разные вещи, а Template хочет имя папки. Остальные поля — Description, Version, Author, Text Domain — документация перечисляет как поддерживаемые, часть из них обязательна только при отправке темы в каталог WordPress.org.

functions.php и screenshot.png

Файл functions.php не обязателен: он нужен, когда вы добавляете свой PHP-код или подключаете стили. Файл screenshot.png отвечает за картинку в разделе «Внешний вид → Темы», документация указывает размер 1200 × 900 и допускает PNG и JPG. На работу сайта не влияет, но когда в списке висят четыре одинаковых серых квадрата, вы рано или поздно активируете не ту.

Подключение стилей: где ломается чаще всего

В интернете живёт совет «вставьте вот этот код, и заработает». Документация честнее: универсального рецепта нет, темы по-разному подключают свои стили, и нужно посмотреть код конкретной родительской темы. Разбор сводится к трём случаям.

Родительская подключает и свой, и дочерний стиль. Документация называет это идеальным вариантом: делать ничего не нужно, style.css дочерней темы подключится сам.

Родительская подключает только свой стиль. Тогда стиль дочерней темы подключаете сами — через wp_enqueue_style() на хуке wp_enqueue_scripts, взяв адрес функцией get_stylesheet_uri().

Родительская подключает стиль активной темы (тем же get_stylesheet_uri()). Тогда подключится как раз дочерний файл, а родительский нет — и его добавляете сами через get_parent_theme_file_uri( 'style.css' ).

Есть нюанс порядка, из-за которого «стили не применяются»: в документации отмечено, что дочерние темы загружаются раньше родительских. Если ваше правило перебивается родительским, дело в порядке подключения, а не в капризах движка. Для блочных тем этот шаг вообще необязателен: оформление там задаётся через theme.json, и подключать style.css нужно, только если вы действительно хотите грузить CSS из него.

Свои файлы внутри темы подключаются специальными функциями: PHP-файл — через get_theme_file_path(), ссылка на файл по адресу — через get_theme_file_uri(). Путь строкой руками не прописывают.

Что меняете и где это правильно делать

Половина вопросов про дочернюю тему возникает потому, что в неё кладут то, чему там не место.

Что меняете Где это правильно делать
Цвета, отступы, шрифты, мелкая вёрстка style.css дочерней темы; в блочной теме — через theme.json или настройки редактора
Разметка шапки, подвала, карточки записи Копия файла шаблона в дочерней теме — она заменит родительский
Своя функция, хук, фильтр, шорткод functions.php дочерней темы, кодом, который вы пишете заново, а не копируете из родителя
Логотип, меню, виджеты, настройки темы из админки Интерфейс WordPress; в файлы это не выносится
Поведение плагина Средства плагина: его настройки, его хуки, отдельный небольшой плагин
Функциональность, которая должна пережить смену темы Отдельный плагин: при смене темы её код перестаёт работать
Файлы ядра в wp-includes и wp-admin Нигде. Обновление затрёт правку, а до тех пор она ломает совместимость

Как перенести правки, которые уже внесли в родительскую тему

Ситуация типовая: сайту три года, в теме что-то правили, кто — неизвестно. Порядок такой.

Сначала копия — файлов и базы, до того как вы тронули хоть один файл. Как её делать и, главное, как проверять, что она разворачивается, — в материале про резервную копию WordPress.

Найдите сами правки. Скачайте архив той же темы той же версии, что стоит у вас, и сравните папки программой сравнения файлов: она покажет отличающиеся файлы и подсветит строки. Это надёжнее, чем читать код глазами, — изменения обычно точечные, две строки в файле на восемьсот. Так же находятся правки, внесённые через встроенный редактор файлов в админке: визуально тема «чистая», а отличия сравнение показывает все.

Разложите найденное по типам. CSS переезжает в style.css дочерней темы. Изменённые шаблоны копируются целиком под теми же именами. Куски PHP из functions.php переносятся — именно куски, ваш добавленный код, а не весь файл.

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

Обновляйте родительскую тему в последнюю очередь. Сначала убедитесь, что на дочерней теме сайт выглядит как раньше. Если после обновления ничего не изменилось — перенос сделан правильно.

Как понять, какая тема сейчас активна

Откройте «Внешний вид → Темы». Активная стоит первой и подписана. Дальше две проверки: есть ли в списке пара тем с похожими названиями, где у одной в конце что-то вроде Child, и указана ли в карточке активной темы родительская. Если родительской в описании нет — активна обычная тема, и правки сейчас класть некуда.

Третий способ — через файловый менеджер хостинга: зайдите в wp-content/themes/ и посмотрите, есть ли в каком-нибудь style.css строка Template. Её наличие и означает, что тема дочерняя.

Заодно проверьте, не стоит ли тема неизвестного происхождения со стороннего сайта. На что смотреть при выборе — в материале о том, как выбрать тему для WordPress.

План на один вечер

Шаг Что делаете Как понять, что шаг прошёл
1 Копия файлов и базы Архив открывается, в нём есть wp-content и дамп базы
2 Записываете точное имя папки родительской темы Имя переписано посимвольно из wp-content/themes/
3 Создаёте папку дочерней темы рядом с родительской Папка на месте, имя латиницей, без пробелов
4 Создаёте style.css с полями Theme Name и Template Тема появилась в «Внешний вид → Темы»
5 Активируете дочернюю тему Сайт открывается и выглядит как раньше
6 Смотрите, как родительская тема подключает стили, при необходимости добавляете functions.php Оформление на месте, нужные таблицы стилей подключены
7 Переносите правки по одной, проверяя сайт после каждой Сайт открывается, в консоли браузера нет новых ошибок
8 Назначаете меню, проверяете виджеты и настройки, привязанные к теме Меню в шапке и подвале на местах, боковые блоки не опустели
9 Обновляете родительскую тему После обновления внешний вид не изменился
10 Проверяете главную, карточку, контакты и форму заявки Формы отправляются, письма приходят, телефон верный

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

Чего дочерней темой чинить не надо

Поведение плагинов. Плагин обновится так же, как тема, и правка в его файлах исчезнет. Механизма замещения файлов плагина у дочерней темы нет — работайте настройками плагина и его хуками.

Файлы ядра. Их не правят никогда и никакой темой не переопределяют.

Функциональность, не зависящую от оформления. Положите в functions.php дочерней темы регистрацию типов записей, обработку форм или обмен с CRM — и в день смены дизайна всё это отключится вместе со старой темой. Такому коду место в отдельном плагине.

Скорость. Дочерняя тема не ускоряет и не замедляет сайт заметно: движок читает файлы из двух папок вместо одной. Если сайт тормозит, причина в другом месте.

Когда это не сработает и нужен человек

Тема переделана до неузнаваемости и не обновляется в принципе. Купленная когда-то на стороннем рынке, переписанная под клиента, без обновлений и без оригинального архива. Дочерняя тема тут ничего не спасёт: вопрос стоит иначе — жить с этим дальше или переезжать на поддерживаемую тему.

Правок накопилось слишком много. Документация отдельно замечает: когда переделок в дочерней теме становится очень много, поддерживать её тяжело, и для объёмных проектов часто разумнее сделать форк исходной темы и вести собственную полноценную. Решение принимается по ситуации.

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

Сайт уже сломан, а копии нет. Здесь самодеятельность обходится дороже всего: каждая следующая попытка «просто попробовать» уменьшает шансы вернуть исходное состояние.

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

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

Можно ли сделать дочернюю тему от дочерней

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

Что будет, если удалить родительскую тему

Дочерняя перестанет работать: наследовать станет нечего. Родительская должна оставаться установленной, даже если вы её не активируете.

Нужна ли дочерняя тема, если я не лезу в код

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

Почему после активации дочерней темы пропало оформление

Почти всегда это подключение style.css: родительская тема подключала свой стиль так, что при активной дочерней этот вызов перестал срабатывать. Разбирается по коду родителя, чинится подключением нужной таблицы стилей через functions.php.

Дочерняя тема как-то влияет на позиции в поиске

Сама по себе нет: робот видит готовый HTML и не знает, из скольких папок он собран. Влияет то, что вы через неё делаете — заголовки, микроразметка, скорость, структура страниц. Дочерняя тема тут инструмент, а не фактор.

Коротко

Правка файлов темы напрямую живёт до первого обновления: оно не дописывает изменения, а раскладывает свежие файлы поверх старых.

Минимальная дочерняя тема — папка и один файл style.css, в заголовке которого есть Theme Name и Template с точным именем папки родительской темы. functions.php добавляется только под свой PHP-код или подключение стилей.

Шаблоны, части шаблонов и паттерны замещаются файлом с тем же именем. functions.php не замещается: загружаются оба файла, дочерний первым, поэтому копировать в него код родителя нельзя — будет фатальная ошибка из-за одинаковых имён функций.

Подключение стилей зависит от конкретной родительской темы. Универсального фрагмента кода нет, и документация говорит об этом прямо: смотрите код родителя и выбирайте один из трёх сценариев.

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

Если тема уже переделана до неузнаваемости, оригинала не осталось, а сайт нужен работающим завтра, разбирать это в одиночку дорого по времени и рискованно. Приходите на консультацию: посмотрим, что у вас в теме на самом деле, что переносить, а что проще переписать, — и сделаем так, чтобы следующее обновление прошло незаметно. Официальный разбор состава дочерней темы и требований к заголовку style.css — в документации WordPress.

Увеличьте позиции и продажи вашего сайта

Профессиональное SEO-продвижение с гарантией результата. Выберите подходящую услугу:

Анатолий Кузнецов — SEO-оптимизатор

Остались вопросы по продвижению?

Меня зовут Анатолий Кузнецов, я SEO-оптимизатор с 20-летним стажем. Разберу ваш сайт, отвечу на вопросы и подскажу, что улучшить для роста позиций в Яндексе и Google.

Связаться со мной →

Комментарии

Игорь

Сделал дочернюю тему по инструкции, активировал — сайт открылся голым текстом без единого стиля. Вернул родительскую, всё встало на место. Где я промахнулся?

Анатолий Кузнецов автор

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

Марина

У меня тема куплена на стороннем рынке, обновлений к ней не было два года. Есть ли вообще смысл городить дочернюю, если обновлять всё равно нечего?

Константин

Не согласен с посылом статьи. Дочерняя тема — лишняя сущность: две папки вместо одной, лишние обращения к файлам, путаница у следующего подрядчика. Проще один раз записать все правки в текстовый файл и после обновления заливать их заново.

Анатолий Кузнецов автор

На словах схема рабочая, на практике ломается в одном месте: обновления темы часто ставятся автоматически или руками человека, который про ваш текстовый файл не знает. Между обновлением и обнаружением пропажи проходит от нескольких часов до нескольких недель — всё это время посетители видят старый телефон или сломанный блок. Про лишние обращения к файлам: движок читает две папки вместо одной, разница обычными инструментами не измеряется. Про путаницу наоборот — подрядчику проще, потому что все правки лежат в одном месте, а не растворены в восьмистах строках чужого файла. Ваш подход честно работает в одном случае: когда обновления ставите только вы и только вручную.

Лариса

Подскажите, а виджеты и меню после переключения на дочернюю тему точно слетают? Боюсь трогать, сайт рабочий.

Михаил

Лариса, у меня меню пришлось назначить заново, боковые блоки встали сами. Ничего не пропадает насовсем, просто новая тема — новый набор настроек. Делал вечером за двадцать минут, посетители ничего не заметили.

Наталья

Скопировала в дочернюю тему весь functions.php родителя, как советовали на форуме. Сайт лёг, белый экран. Что теперь?

Анатолий Кузнецов автор

Совет с форума неверный, и в документации WordPress прямо написано почему: functions.php дочерней темы не заменяет родительский, загружаются оба. Вы объявили все функции родителя дважды, PHP на этом остановился. Лечится быстро: зайдите по файловому доступу в папку дочерней темы и переименуйте скопированный functions.php в любое другое имя — сайт поднимется сразу. Дальше создайте пустой functions.php и положите туда только тот код, который дописывали сами: свои функции, свои хуки, подключение стилей. Родительский файл трогать не нужно, он продолжит работать.

Кирилл

Уточнение по имени папки: у меня тема в админке называлась с пробелом и с заглавной буквы, я так и вписал в Template. Тема в списке появилась, но при активации сайт выдал ошибку. Помогло только точное имя папки с диска.

Леонид

А как быть, если правки вносили через редактор файлов прямо в админке и никто не помнит какие? Сравнивать с чем?

Анатолий Кузнецов автор

Сравнивать с оригинальным архивом ровно той версии темы, что стоит у вас сейчас. Версия видна в карточке темы в админке. Скачиваете архив этой версии, распаковываете рядом с копией вашей папки и открываете обе программой сравнения каталогов. Она покажет список отличающихся файлов и подсветит конкретные строки. Обычно отличий оказывается три-четыре файла и десяток строк, а не «весь сайт переписан». Если архив именно этой версии взять негде, сравнивайте с ближайшей доступной: лишний шум будет, но свои правки вы в нём узнаете.

Инна

Спасибо за таблицу «что меняете — где это делать». Забрала целиком, повесила подрядчику в задачу. Особенно про то, что важный код надо выносить в плагин, а не в тему.

Максим

У меня блочная тема, style.css в ней практически пустой, всё через настройки редактора. Дочерняя тема в таком случае вообще нужна?

Анатолий Кузнецов автор

Зависит от того, что собираетесь менять. Пока всё меняется в редакторе, изменения хранятся в базе данных и обновление темы их не затрагивает — дочерняя тема не нужна. Она понадобится в момент, когда захочется переопределить шаблон или паттерн файлом либо добавить свой PHP-код. Тогда кладёте в дочернюю тему файл с тем же именем, и он заменит родительский; для паттернов, по документации, должно совпадать ещё и поле Slug. Подключение style.css для блочной темы шаг необязательный, его делают, только если реально нужен CSS из этого файла.

Ирина

Сделала всё по шагам, сайт после обновления родительской темы не изменился ни на пиксель. Впервые обновляла без паники. Спасибо.

Никита

Добавлю к плану: перед активацией дочерней темы всегда открываю сайт в режиме инкогнито во второй вкладке. Тогда сразу видно, что видит посетитель, а не то, что показывает кэш в моём браузере. Пару раз это спасало от лишних правок вслепую.

Оставьте комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

 Нажимая «оставить комментарий» вы принимаетеправила конфиденциальности 

Прокрутить вверх