ГлавнаяТемыДочерние темы в WordPress

Дочерние темы в WordPress

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

Поддержка дочерних тем (child themes) в WordPress появились ещё давно, но большинство пользователей на сегодняшний день всё равно предпочитают вносить изменения в код исходной темы напрямую. В этой статье мы расскажем о том, как работают дочерние темы в WordPress, и почему именно с помощью дочерних тем следует вносить любые изменения в существующие темы.

Что такое дочерняя тема

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

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

Как создать дочернюю тему

Самая простая дочерняя тема состоит из одного файла style.css, в котором указывается имя дочерней темы, и название директории с родительской темой. В этом же файле часто указывается ссылка на таблицу стилей родительской темы с помощью CSS директивы @import.

В качестве примера мы создадим дочернюю тему My Child Theme и будем использовать стандартную тему Twenty Twelve в качестве родительской.

Сперва убедитесь в том, что родительская тема существует — найдите директорию twentytwelve в wp-content/themes. Затем создайте новую директорию в wp-content/themes и назовите её my-child-theme. В этой новой директории создайте файл style.css и вставьте в него следующий заголовок:

/**
 * Theme Name: My Child Theme
 * Template: twentytwelve
 */
@import url('../twentytwelve/style.css');

С помощью этого заголовка мы определили название нашей новой темы, а так же указали родительскую. Директива @import в данном случае подгружает все стили из темы Twenty Twelve, поверх которых мы будем вносить наши изменения. Без этой директивы, наша дочерняя тема будет наследовать только шаблоны (разметку) родительской темы, а не стиль.

После этого ваша директория с темами должна выглядеть примерно следующим образом:

Структура дочерней темы

Структура дочерней темы

Зайдя в раздел Внешний вид → Темы, вы увидите, что ваша новая тема уже доступна для активации.

Активация дочерней темы

Активация дочерней темы

Если вы её активируете и перейдёте на главную страницу вашего сайта, вы увидите, что ваша дочерняя тема выглядит в точности как стандартная тема Twenty Twelve.

Работа со стилями

Стили CSS дочерней темы можно задать прямо в файле style.css сразу после директивы @import. Например, для установки цвета фона и цвета ссылок в вашей теме, добавьте следующий код в конец файла стилей:

body { background: red; }
a { color: green; }

Таким образом вы можете изменять стили любых элементов родительской темы, а найти необходимый элемент вы можете легко с помощью средств разработчика в браузере Google Chrome или с помощью расширения Firebug для браузера Firefox.

Работа с шаблонами

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

	</div><!-- #main .wrapper -->
	<footer id="colophon" role="contentinfo">
		<div class="site-info">
			Текст подвала
		</div><!-- .site-info -->
	</footer><!-- #colophon -->
</div><!-- #page -->

<?php wp_footer(); ?>
</body>
</html>

Таким образом мы заменили текст в подвале темы Twenty Twelve на наш собственный.

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

Вы так же можете создавать новые файлы шаблонов, которые отсутствуют в родительской теме, и WordPress будет подключать их согласно иерархии шаблонов. Например, если в родительской теме отсутствует файл page.php, вы можете создать файл с таким именем в вашей дочерней теме и WordPress его подключит при отображении какой-либо страницы.

Стоит так же отметить, что подобным образом изменять можно не все файлы родительской темы. Например, вы не сможете изменить файл, который был вызван PHP функцией include или require.

Работа с functions.php

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

Это значит, что в вашем файле functions.php вы можете использовать события, фильтры и так называемые «переопределяемые» функции, для того чтобы манипулировать поведение родительской темы. Например, в файле footer.php в теме Twenty Twelve вызывается событие twentytwelve_credits. Чтобы добавить наш собственный текст во время этого события, мы можем использовать следующий код в functions.php нашей дочерней темы:

<?php
function my_child_theme_credits() {
	echo 'Дополнительный текст подвала';
}
add_action( 'twentytwelve_credits', 'my_child_theme_credits' );

Вы так же можете переопределять некоторые функции родительской темы. Например, в теме Twenty Twelve используется функция twentytwelve_content_nav для отображения навигации по записям. Если вам необходимо изменить поведение этой функции, например использовать навигацию WP-PageNavi, вы можете её переопределить в файле functions.php в дочерней теме:

function twentytwelve_content_nav( $html_id ) {
    if ( function_exists( 'wp_pagenavi' ) )
        wp_pagenavi();
}

Учтите, что переопределять можно не все функции родительской темы, а только те, которые обёрнуты в условие с функцией function_exists, например:

if ( ! function_exists( 'twentytwelve_content_nav' ) ) :
...
endif;

Локализация дочерних тем

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

function my_child_theme_setup() {
	load_child_theme_textdomain( 'my-child-theme', get_stylesheet_directory() . '/languages' );
}
add_action( 'after_setup_theme', 'my_child_theme_setup' );

После этого вы можете использовать функции локализации WordPress в ваших строках:

_e( 'My translatable text goes here.', 'my-child-theme' );

Обратите внимание на второй параметр (текстовый домен), он должен совпадать с тем, что вы указали в вызове функции load_child_theme_textdomain. Таким образом WordPress будет пользоваться директорией languages в дочерней теме для всех строк с доменом my-child-theme, при этом строки в исходной теме будут по прежнему переводиться с помощью исходных языковых пакетов.

Заключение

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

Если же вы хотите внести изменения только на уровне CSS (не изменяя при этом шаблоны), вы так же можете воспользоваться каким-либо плагином для редактирования CSS.

Если у вас возникли вопросы по внесении изменений в существующие темы WordPress — оставьте комментарий и мы обязательно вам ответим.

Подписаться на рассылку

Подписаться → Подпишитесь на бесплатную рассылку журнала WP Magazine и получайте новости, события, подборки тем и плагинов, уроки, советы и многое другое в мире WordPress!

  • Danil

    С дочерними темами в общем понятно, а как быть с плагинами? Есть у меня, например, плагин Captcha, когда я первый раз его поставил, то в блоке его арифметического вопроса текст выводился слева, я изменил вывод по центру в его style.css. Теперь при каждом обновлении плагина он обновляет свой style.css и мои изменения теряются, приходится каждый раз дописывать.

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

      • Danil

        Не понял, своим плагином пытаться переизменить «на лету» css-свойства элемента страницы, сначала применяются свойства капчи, а потом моего?

        • Да, для этого можно использовать более точные селекторы, например если в плагине Captcha .my-class, вы можете использовать body .my-class, ну и в крайнем случае всегда можно использовать !important.

          • Danil

            Довольно трудоемкий и прямо скажем дикий и какой-то некошерный способ :) Особенно учитывая то, что я еще не писал своих плагинов. Других способов разработчики водпресса предложить не могут? Неуж-то это делают все админы блогов? Ведь у большинства плагинов свой файл стилей. Тогда и плагин уже должен быть какой-то универсальный или механизм. А так проще либо не обновлять плагин, либо обновлять его не каждую версию.

          • Если речь идёт о стилях на лицевой странице сайта, вы можете воспользоваться готовым плагином для редактирования CSS, например Jetpack, или дочерней темой, а в остальном все изменения лучше делать через свои сторонние плагины (их создавать не так уж и сложно), особенно если речь идёт о PHP коде, а не только CSS.

            Не обновлять плагин — это не безопасно. Плагины (а так же темы и ядро) нужно обновлять всегда и как можно быстрее.

  • shoorick

    Не получается переопределить функцию :-(
    Я создал дочернюю тему на основе Twenty Thirteen, в файл functions.php дочерней темы положил функцию twentythirteen_fonts_url, надеясь заменить ей одноимённую функцию из темы Twenty Thirteen — и итоге вордпресс падает, ругаясь:

    PHP Fatal error: Cannot redeclare twentythirteen_fonts_url() (previously declared in /path/to/wordpress/wp-content/themes/bright2013/functions.php:39)

    Что делать?

    • shoorick

      Обернул свою функцию в

      if ( ! function_exists(‘twentythirteen_fonts_url’)) {
      // …
      }

      после чего заработало. Но почему? В теме Twenty Thirteen функция twentythirteen_fonts_url не завёрнута в подобную проверку существования.

    • Переопределить можно не все функции родительской темы, а только те, которые обёрнуты в условие function_exists, т.е. в вашем случае переопределить twentythirteen_fonts_url нельзя. Если вам нужно изменить подключаемые стили, вы можете с помощью wp_dequeue_script убрать исходный адрес со шрифтами и добавить свой собственный во время события wp_enqueue_scripts с приоритетом 11 или позднее.

      • shoorick

        А где про это можно подробнее почитать? Я смотрел Кодекс — там что в английской, что в русской версии про разработку дочерних тем написано весьма скупо.

      • shoorick

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

        if ( ! function_exists(‘bright2013_fonts_url’)) {
        function bright2013_fonts_url() {
        $fonts_url = »;
        // …
        // аналогично функции twentythirteen_fonts_url
        return $fonts_url;
        } // function bright2013_fonts_url
        }

        function disable_twentythirteen_fonts() {
        wp_deregister_style(‘twentythirteen-fonts’);
        }

        add_action( ‘wp_enqueue_scripts’, ‘disable_twentythirteen_fonts’, 11 );
        wp_enqueue_style( ‘bright2013-fonts’, bright2013_fonts_url(), array(), null );

        • Примерно это я и имел ввиду :)

  • Владимир

    Добрый день, Константин. Нужна Ваша помощь. Недавно установил себе тему twenty thirteen. Теперь никак не могу увеличить ширину отображения поста. Облазил весь style.css, не представляю, где это можно сделать.

    • Попробуйте:

      .entry-header,.entry-content, .entry-summary, .entry-meta {

      max-width: 1000px;
      }

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

    • Если вам необходимо создать дочернюю тему только для редактирования стилей, то лучше воспользоваться плагином для редактирования CSS. Иначе вам в любом случае понадобится доступ к FTP для редактирования каких-либо PHP файлов. Ну а если необходимо все же создать дочернюю тему из админки, попробуйте плагин One-Click Child Theme.

  • ilnur

    Здравствуйте Константин! Хотел по вашей ссылке загрузить и установить Firebug для браузера Firefox , а мой Firefox сам же и заблокировал сайт в чем проблема может быть? Спасибо

    • Попробуйте установить Firebug с сайта Firefox.

      • ilnur

        Здравствуйте Константин! Я уже пытался установить с сайта Firefox. там тоже самое , а вообще Firebug для браузера Firefox он бесплатный? Просто есть кое какие сомнения там просят сделать пожертвования :).
        Спасибо !

        • Всегда был бесплатный, не знаю, сам уже лет 5 им не пользовался. Кстати в последних версиях Firefox вроде есть собственный встроенный инструмент, посмотрите в меню Tools — Web Developer.

  • Мехман

    Привет, спасибо за статью, один вопрос, если я хочу изменить файл темы который находиться внутри темы в другой папке, как создать файл в дочерней теме? Указать папку а затем внутри нее и сам файл? Пример: мне надо поменять что то вот тут moya-tema/templates/template-blog.php мне нужно создать этот файл template-blog.php вот тут? moya-tema-child/templates/template-blog.php ?? я правильно понял? или достаточно открыть этот файл template-blog.php сразу тут? moya-tema-child ? в итоге получиться так moya-tema-child/template-blog.php Cпасибо!

    • Вы правильно поняли, иерархию родителя необходимо соблюдать, но если речь идет именно о шаблонах страниц, то в дочерней теме вы можете создавать свои собственные шаблоны страниц и заменять шаблоны родителя необходимости нет.

      • Владислав

        Константин, здравствуйте!

        Вопрос по этой же теме.
        Мне очень стыдно, возможно, не прохожу тест на сообразительность… ;)

        Создана дочерняя тема. Создан style.css, после импорта (@import url) в него внесены изменения. Работает!
        Создан functions.php. В него записаны разные доработки (код обфускации, прочие плюшки). Работает!

        Но надо подредактировать ряд файлов, находящихся в родительской теме в поддиректориях. Вот тут — не получается.
        Пример: родительская_тема/includes/widgets/widget-feedburner.php
        создаю вложенную папку в дочерней теме, кладу туда соответствующий исходный файл:
        дочерняя_тема/includes/widgets/widget-feedburner.php
        (надо изменить настройки языка при подписке по е-мейл).
        Редактирую, сохраняю изменения.
        НЕ РАБОТАЕТ!
        Проверяю правильность правок. Вношу правки в файлы родительской темы — всё работает, как надо.
        Такое же происходит и с другими файлами во вложенных папках :(

        WP — 3.9.1
        Шаблон — лицензионный коммерческий шаблон Jarida от TieLabs.

        Возможно подскажете, где и в чём ошибаюсь и как это можно исправить.

        С уважением,
        Владислав

        • Владислав,

          Дочерние темы позволяют изменять только стандартные файлы шаблонов WordPress и любые файлы подключенные с помощью функций get_template_part(), locate_template() и т.д. Очевидно файлы виджетов подключаются с помощью обычного require() или include() в PHP, к сожалению такое в дочерней теме «перехватить» нельзя.

  • Roman Malashin

    Привет. Я не использовал @import url. Пока что проблем в дочерней теме не возникало. В чем они могут появиться?

    • Проблем возникнуть не должно. @import лишь для того, чтобы подключить CSS файл родительской темы, а не начинать с нуля. Этот файл вы можете также подключить с помощью wp_enqueue_style() и get_template_directory_uri().

      • Roman Malashin

        Костя, спасибо Вам!

  • Дмитрий Курбанов

    Здравствуйте Константин. Вырвал уже себе все волосы с проблемой локализации дочерней темы. Все сделал по инструкции. Вставил в функции нужный код. Создал po и mo файлы (с помощью плагина CodeStyling Localization) в дочерней и родительской теме. Однако, после обновления темы, как положено, исчезли файлы локализации в родительской теме и весь перевод изчез. Я все проверил. Я так понимаю, что вордрпресс берет файлы локализации только из родительской темы и не видит их в папке languages дочерней темы. Приходится постоянно копировать po и mo файлы из дочерней в родительскую и только тогда работает. Хотя, как я понимаю, файлы локализации должны работать из дочерней темы и не подвергаться изменениям родительской темы. Не подскажете, что может быть проблемой? Спасибо.

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

      Если вы хотите изменить файл локализации родительской темы, то лучше всего воспользоваться директорией wp-content/languages/themes/themename и разместить там файлы перевода, хотя в 4.0 в этой области планируются изменения, и пока не совсем понятно как это скажется на обновлении.

  • Галина

    Сделала все, как вы сказали, но почему-то стили так и не подтянулись.
    /*
    Theme Name: Sueva-child
    Description: Моя дочерняя тема
    Template: suevafree
    */

    @import url(‘../suevafree/style.css’);

    в чем может быть проблема?

    и отдельное спасибо за ваш сайт, все очень доходчиво, понятно написано, а главное приятно глазу и прекрасно структурированно!

    • Было бы проще если бы прислали ссылку на ваш сайт, где установлена эта дочерняя тема.

      • galka moskalenko

        может ответ не прошел проверку? как мне написать вам ссылку

      • galka moskalenko

        naturemama точка ру ) только так

  • galka moskalenko

    Сделала все тоже самое с другой темой (twenty twelve, все получилось идеально. В чем же причина? Сама тема такая? Что еще может влиять на внешний вид страницы, помимо файла style.css?

  • Евгений

    Здравствуйте Константин. А как сделать так, чтобы с помощью дочерней темы удалить часть кода из function.php. Например в родительской теме в файле function.php у меня создаётся фото с указанными размерами по средством кода «add_image_size( ‘thumb-small’, 160, 160, true );». Я хочу сделать так, чтобы этот кусок кода не выполнялся, как это сделать?

  • Елена

    Добрый день, Константин. У меня такая же проблема как и у Галины. Хотела отцентрировать twenty fourteen. Но не подгружаются стили из родительской темы. Подскажите, пожалуйста, что не так?
    /*
    Theme Name: twentyfourteen
    child
    Template: twentyfourteen

    */
    @import url(‘..twentyfourteen/style.css’);

    • По всей видимости у вас не хватает знака / между .. и twentyfourteen:

      @import url(‘../twentyfourteen/style.css’);

  • На этом сайте активна тема SuevaFree а не дочерняя.

    • galka moskalenko

      Я удалила предыдущий вариант и сделала заново и все получилось, видимо где-то опечатка закрадывалась. Извините за беспокойство.

  • Дамир

    привет, классно написано
    а в файле function.php, закрывающий тег PHP ?> нужно ставить?

  • Подскажите как быть с плагинами? Есть два конкретных примера. Я изменил плагин woocommerce — добавив свой хук, и изменив порядок вывода элементов в плагине. Внес изменения в сам плагин, а не в файлы шаблона. Как правильно вносить изменения в плагины — чтобы при обновлении они сохранялись? Создавать свой новый плагин или как? Подскажите пожалуйста.

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

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

      • Спасибо за быстрый ответ. Вариант с файлом .diff это автоматизированный процесс или все изменения необходимо производить каждый раз вручную?

        • Если вы его автоматизируете, то он будет автоматизирован :) Утилиты diff и patch есть в каждой Unix-подобной системе. Если же плагин есть на GitHub, то можно попробовать вести fork там, и время от времени обновлять его с оригинала.

          • Спасибо большое за пояснения!)

  • Bondarov

    Добрый день вам! Делаю все правильно. Подключил импорт в дочурку. Короче не меняет банально фоновый цвет сайдбара! Пишу верный айди сайдбара в css дочерней темы и новые свойства для него. Ниче не меняется. Ради принципа внес свойство ширины, ширина применилась, а цвет нет! Заколупался уже. В самой теме оригинале есть папка css,в которой много файлов стилей. Эти файлы точно унаследовались судя по активированной дочерней теме, но не меняются некоторые моменты. Такое ощущение что они «НЕ ПЕРЕКРЫВАЮТСЯ» дочерней темой! Что же делать.

    • Сложно сказать не имея пред глазами код. Пришлите ссылку на ваш сайт – посмотрим.

  • Руслан

    День добрый, подскажите пожалуйста если мы работаем в дочерней теме родительская тоже должна быть активирована или нет. Я в этом деле новичок, заранее спасибо.

    • Руслан, нет, на сайте может быть активна только одна тема, и это должна быть ваша дочерняя. Для работы дочерней темы, родительская тема должна быть установлена (но не активна).

  • Владимир

    Доброго дня, Константин!
    Подскажите, как в дочерней теме на WPMU, используя файл functions.php, удалить из стандартной формы комментариев поле «сайт»?

    Пробовал описанный в интернете вариант вставить в functions.php дочерней темы:

    function wpbeginner_remove_comment_url($arg) {
    $arg[‘url’] = »;
    return $arg;
    }
    add_filter(‘comment_form_default_fields’, ‘wpbeginner_remove_comment_url’);

    Не работает(

    • Владимир

      Пробовал вставить и такой код, найденный на просторах интернета:

      function remove_comment_fields($fields) {
      unset($fields[‘url’]);
      return $fields;
      }
      add_filter(‘comment_form_default_fields’, ‘remove_comment_fields’);

      Всё равно не работает. Может есть решение более простое?

      • Владимир, решение выглядит правильным. Мы его протестировали с темой Twenty Fifteen.

        function my_remove_comment_fields( $fields ) {
        unset( $fields[‘url’] );
        return $fields;
        }
        add_filter( ‘comment_form_default_fields’, ‘my_remove_comment_fields’ );

        Возможно вы используете на сайте стороннюю форму комментирования, например Disqus или IntenseDebate? Или же ваша тема самостоятельно строит форму комментирования, не используя этот фильтр.

        • Владимир

          Константин, скорее всего тема самостоятельно строит форму комментирования.

          • Владимир

            Может возможно сразу во всей сети отключить это поле прямо в WPMU?
            То есть, что бы WP управляющий сетью вообще забыл про поле URL в комментах.
            Заранее благодарю за помощь.

  • Константин, поделитесь опытом, как вести разработку одной темы несколькими программистами сразу? Дочерние темы?

    • Нет, лучше чтобы это была одна тема, а для совместной работы используйте систему контроля версий, например Git, Subversion или Mercurial.

  • Вадим Волос

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

    Вот ксс код дочерней темы:

    /*
    Theme Name: Accelerate-1
    Description: Дочерняя тема для темы Accelerate, сделал чтоб при обновлении оригинальной темы не слетал русский язык.
    Author: Vadim
    Template: accelerate
    */

    @import url(‘../accelerate/style.css’);

    • Расскажите как именно вы переводите тему на русский язык?

      • Вадим Волос

        Вопрос уже не актуален, спасибо за вашу помощь!

  • Вадим Волос

    Здравствуте подскажите пожалуйста, в дочерней теме создал (template-menuleft-slider.php) создал собственно для того чтоб выше заголовка добавить слайдер (слайдер нужен на избранных страницах поэтому его решил добавить только в код этого шаблона страницы). Все уже добавил все ок, но у меня появились сомнения, в правильное ли я место в коде я добавил. Вот код этой страницы, посмотрите:
    ?php
    /*
    Template Name: MenuLeft+Slider
    */
    get_header(); the_post();
    ?>

    ‘left-menu2’ ) ); ?>

    <div >

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

    Блин дискус в комментариях пхп код режет…

  • Vlad V

    Здравствуйте, подскажите почему не работает дочерняя тема в Twenty Fifteen ?

    • Установлена ли родительская тема? Правильные ли права стоя на папки и файлы тем на сервере?

  • Makway

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

    • А какой именно файл (CSS, JS, PHP) файл надо подключить и где именно?

      • Makway

        Ну, дапустим в корне сайта есть папка 123, в ней есть файл file.php

        • Если вы имеете ввиду «переподключить» файл, т.е. подключит свой собственный 123/file.php вместо файла 123/file.php родительской темы, то это возможно только в том случае, если родительская тема подключает этот файл с помощью get_template_part(), а если он подключается обычным include/require, то это не возможно без правок в родительской теме.

          • Makway

            Ясненько, по всей видимости у меня через include/require, жаль(

  • Alex

    Добрый день. Происходят странные вещи.)) В css файле (дочки) меняю стили все окей, но иногда почему то некоторые не хотят работать. Не подскажите в чем может быть проблема?

  • Lana

    Установила тему которая уже содержала в себе и родительскую и дочернюю. С самого начала астивировала и работала в родительской. Пришло время установить обновление. Надо бы активировать дочернюю перед этим мероприятием, но она не полностью копирует родительскую (теряет меню не ненокорых страницах и проч.) Что нужно сделать чтобы она стала идентичной ? Спасибо.

  • Andy

    А как переопределить в function.php дочерней темы подключение файла, сделанное в function.php родительской темы? Конкретно, требуется следующее: в файле function.php родительской темы есть строка require get_template_directory() . ‘/inc/custom-header.php’; При этом при активации дочерней темы custom-header.php тянется из родительской темы. Я так понимаю, что для того, чтобы custom-header.php брался из дочерней темы, нужно строку подключения этого файла переопределить в function.php дочерней темы. Как это сделать? Простое указание строки require get_template_directory() . ‘/inc/custom-header.php’; в function.php дочерней темы вызывает ошибку.

    • Нет, если тема использует напрямую require, то изменить это поведение из дочерней нельзя. В вашем случае лучше найти фильтры и события которые исполняются в custom-header.php и попробовать их отключить с помощью remove_action или remove_filter.

  • Denimone

    как дочерние посты сделать ссылками на другую страницу?

  • Павел

    Возможно глупость но этого не понял: «_e( ‘My translatable text goes here.’, ‘my-child-theme’ );».
    Вообще получилось благополучно создать дочернюю тему, скинул дочке папку «languages» с измененными файлами перевода. Прописал в файле functions.php все как указано в статье, но перевод не отображается. Пробовал переустанавливать тему с последующей активацией, но ничего не получилось.

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

      $mofile = apply_filters( ‘load_textdomain_mofile’, $mofile, $domain );

      Т. е. нужно с помощью своей функции «схватиться» за load_textdomain_mofile и сравнив domain подсунуть путь до файлов в дочерней теме. Тем самым можно будет хранить переводы родительской темы в дочерней без необходимости изменять сами шаблоны.

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

      Возможно глупость но этого не понял: «_e( ‘My translatable text goes here.’, ‘my-child-theme’ );».

      My translatable text goes here — текст, который необходимо перевести.

      my-child-theme — текстовый домен дочерней темы (должен отличаться от родительской).

      • Павел

        Перевод отсутствовал на странице contact.php создал ее копию в дочке. Отредактировал домены в этом файле на домен-child. Ну и собственно все, перевод появился. Но получается теперь в случае обновления contact.php меня это не затронет. Склоняюсь к тому что нужно переопределить родительскую функцию «load_theme_textdomain»

        • Павел

          Хотя в таком случае не будет обновляться перевод. Придется оставить как есть.

    • А, хотя стоп. Можно же сравнивать домен — он красивый, т. е. через обычный if($domain === 'parent-theme-name').... А что-либо делать с $mofile не надо — в него нужно просто записать новый путь до файла из дочерней темы и все :)

  • Tran

    Здравствуйте. Вот если родительская тема идёт с мощным кастомайзером, позволяющим загружать изображения для оформления темы в собственные папки, то после создания дочерней темы куда всё это будет грузится — всё равно в родительскую или уже в папки дочерней темы?
    А еще если нужно внести изменения в кучу php-инклудов, как правильно это сделать в дочерней теме?
    Хм… и любопытно, а если разработчики родительской темы во многих местах стилей использовали конструкцию !important , то насколько адекватно будет работать дочерняя тема?

    • Вообще тема не должна загружать ничего в свои директории, она должна загружать весь пользовательский контент только в wp-content/uploads, ну а вообще зависит от кода, может быть загружаются в родительскую, а может и в дочернюю.

      В инклуды изменения вносить с помощью дочерних тем нельзя, т.к. они загружаются напрямую через include() или require(), а не через locate_template().

      С !important работать вообще сложно, для переопределения такого стиля, вам необходимо также использовать !important и при этом еще выбрать более специфичный CSS селектор.

      • Tran

        Не должна — это одно, а как некоторые разработчики тем делают — уже другое, хотя так и неправильно.
        Спасибо за ответы. Похоже в моем случае создать тему для клиента заново будет проще, чем иметь увлекательное приключение с ковырянием имеющегося нагромождения от неизвестного автора.

  • Вариант с import уже не актуален? Тут ты рекомендуешь другой вариант…
    https://konstantin.blog/2014/child-themes-import/

    • Оба варианта работают, через wp_enqueue_script() немного быстрее.

  • Андрей

    Здравствуйте.Увидел тему Locations Responsive Directory WordPress Theme
    ,она именно дочерняя,как я понял.Однако,все т.н. стандартные пути ее активации не работают.Подскажите,как правильно делать или в каком пути идти

  • Alexander Plyusnin

    Здравствуйте, просмотрел комментарии, но вроде нигде не наткнулся на информацию об изменении путей к стилям и скриптам в дочерней теме. Подскажите пожалуйста, как правильно подключать скрипты. Проблема такая, что тема использует superfish menu, при создании дочерней этот, fancybox и другие скрипты отключились. Как правильно их включить в дочернюю? Тема Profound на всяк случай

  • Serg M

    Константин!
    Делаю дочернюю тему на основе родительской GeneratePress.
    Так как Вы рекомендуете.
    Но при просмотре результата эта адаптивная (дочерняя) тема не адаптируется под смартфон. А именно — меню не складывается в три черточки, а совсем пропадает.
    Как быть?

  • Алена

    я вроде все правильно сделала, но у меня пишет «Повреждённые темы

    Следующие темы установлены, однако являются неполными. Тема должна иметь таблицу стилей и шаблон.

    Название Описание

    My Child Theme Отсутствует родительская тема. Пожалуйста, установите родительскую тему «Sydney» Удалить Установить родительскую тему»
    У меня тема Sydney, и я прописала в style.css —
    /**

    * Theme Name: My Child Theme

    * Template: Sydney

    */

    @import url(‘../sydney/style.css’);

    Что не так?(

    • Илья

      Template: sydney (с маленькой буквы)

  • Danil Strelchenya

    Помогите, пожалуйста, изменяю стиль в файле css, но не приминяется, понял, что причина в том, что стиль еще прописан в самом html, между:

    Но, я не знаю, откуда берется эта информация и как её самому изменить, подскажите, пожалуйста.
    Какой файл отвечает за это?