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

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

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

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

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

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

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

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

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

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

1. Подключаемые функции

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

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

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

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

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

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

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

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

2. Приоритет функций

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

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

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

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

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

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

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

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

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

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

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

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

3. Отвязка функций от хуков

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

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

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

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

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

<?php
remove_action( 'init', 'parent_function' );
?>

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

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

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

О приоритетах в функциях

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

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

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

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

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

Заключение

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

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

Вам понравился материал?

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

Такой e-mail уже зарегистрирован. Воспользуйтесь формой входа или введите другой.

Вы ввели некорректные логин или пароль

Извините, для комментирования необходимо войти.

2 комментария

сначала новые
по рейтингу сначала новые по хронологии
Алексей

Добрый день! Помогите пожалуйста перезаписать функцию в родительской теме. Читал вашу статью но не смог разобратся. Функция в родительской теме: add_filter( 'enlightenment_entry_meta_args', 'enlightenment_filter_entry_meta_args' );

function enlightenment_filter_entry_meta_args( $args ) {....

А вот как переопределить функцию плагина?