wordpress-function

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

Можно подумать, что функции будут работать таким же образом: создав новую функцию в дочерней теме в functions.php файле с тем же именем, что и в родительской теме, и она будет иметь приоритет. К сожалению, это не всегда так.

Рассмотрим три способа, которые можно использовать, чтобы переопределить (удалить или изменить) функции из родительской темы в дочерней теме WordPress:

  • подключаемые функции
  • приоритет функции
  • удаление функции от хука к которому она привязана

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Удаление привязки функции к хуку

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

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

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

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

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

Обратите внимание на приоритеты функции

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

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

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

Подведем итоги

Переопределение (изменение или удаление) функции родительской темы немного сложнее, чем переопределение шаблонов темы или стилей, но вполне выполнимая задача. Мы рассмотрели 3 способа как сделать это:

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

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