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

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

Смотрите также:

  • Параметр тем WordPress с использованием дочерней темы
  • 7 плагинов и дочерних тем для улучшения темы Twenty Fourteen
  • WordPress Codex — ценный помощник разработчика
  • Советы для начинающих разработку веб-сайта на WordPress
  • Куда вставлять этот программный код в WordPress? Общая структура файлов темы

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

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

  • Подключаемых возможностей(известных как pluggable functions)
  • Приоритета возможностей
  • Открепления возможностей с хука, к которому они прикреплены

Как работают возможности в родительской и в дочерней темах

Прежде чем начать рассматривать данные способы, будет полезным узнать, как же фактически работают возможности в обеих темах.

Первое. Все возможности родительской темы будут активны при использовании дочерней темы. И для этого не необходимо что-либо добавлять в файл ее возможностей. Данным они отличаются от каскадных таблиц стилей(CSS), в которых необходимо вручную добавлять таблицу родительской темы в таблицу дочерней.

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

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

1. Подключаемые возможности

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

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

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

<?phpif(! function_exists( 'my_function')) { function my_function() { // Contents of your function here. }}?>

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

Далее при создании возможности в дочерней теме, действие которой необходимо отменить в активной родительской, надо дать ей такое же название, как и возможности в родительской:

<?phpfunction my_function() { // Contents for your function override here.}?>

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

2. Приоритет возможностей

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

При создании возможностей можно легко расставить их приоритет, что уведомит WordPress о том, когда и какую использовать.

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

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

<?phpfunction parent_function() { // Contents for your function here.}add_action( 'init', 'parent_function');?>

Эта функцию прикреплена к хуку init и для нее не был указан приоритет. По умолчанию WordPress обозначает приоритет цифрой 10 для всех возможностей без заданного приоритета, так что чтобы выполнить другую возможность после данной возможности без заданного приоритета, укажите число больше 10. Можно использовать число 15, и таким образом в будущем будет функция добавить к какой-либо возможности приоритет в промежутке между 10 и 15.

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

<?phpfunction child_function() { // Contents for your function here.}add_action( 'init', 'child_function', 15);?>

Другой вариант — сначала присвоить возможности в родительской теме приоритет 20:

<?phpfunction parent_function() { // Contents for your function here.}add_action( 'init', 'parent_function', 20);?>

А далее возможности в дочерней теме задать приоритет с бОльшим числом, чтобы она была выполнена после возможности из родительской темы:

<?phpfunction child_function() {    // Contents for your function here.}add_action( 'init', 'child_function', 25);?>

3. Отвязка возможностей от хуков

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

В этом случае можно отвязать родительскую возможность из хука, к которому она была прикреплена. Это можно без проблем сделать при помощи возможности remove_action() или remove_filter(). Какую из них использовать зависит от того, прикреплена ли функцию к хуку action или хуку filter в родительской теме.

Давайте на секунду вернемся к предыдущей возможности в родительской теме:

<?phpfunction parent_function() {    // Contents for your function here.}add_action( 'init', 'parent_function');?>

Чтобы открепить эту возможность от хука action и впоследствии предотвратить ее исполнение после дочерней возможности, необходимо создать возможность в дочерней теме при помощи remove_action():

<?phpremove_action( 'init', 'parent_function');?>

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

<?phpfunction child_remove_parent_function() {    remove_action( 'init', 'parent_function');}add_action( 'wp_loaded', 'child_remove_parent_function');?>

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

О приоритетах в возможностях

Необходимо учитывать, что при удалении возможности с заданным приоритетом при помощи remove_action() или remove_filter(), необходимо включить также приоритет и при удалении данной возможности. Иначе ничего не будет работать.

Поэтому если функцию в родительской теме выглядит так:

<?phpfunction parent_function() {    // Contents for your function here.}add_action( 'init', 'parent_function', 15);?>

…то необходимо включить то же значение приоритета и при ее удалении:

<?phpfunction child_remove_parent_function() {    remove_action( 'widgets_init', 'parent_function', 15);}add_action( 'wp_loaded', 'child_remove_parent_function');?>

Заключение

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

Источник: code.tutsplus.com

Добавить комментарий

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