Как переписать функции родительской темы WordPress с помощью дочерней?

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

Многие начинающие WordPress-пользователи думают, что и с файлом functions.php ситуация та же. К примеру, в этом файле родительской темы есть функция с именем disable_emojis_tinymce(), которую необходимо изменить в дочерней. Если в дочерней теме вы создадите файл functions.php и добавите в него функцию с тем же именем, то система выдаст следующую ошибку:

Cannot redeclare disable_emojis_tinymce()

Это означает, что в списке всех функций, доступных для “движка”, не может быть двух с одинаковыми именами.

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

  • подключаемые функции;
  • приоритет функций;
  • удаление функции с хука.

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

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

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

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

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

Переопределение с помощью подключаемых функций

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

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

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

if ( ! function_exists ( 'disable_emojis_tinymce' ) ) {
    function disable_emojis_tinymce() {
        // Содержимое функции.
    }
}

Теперь в своей дочерней теме вы можете смело ее переопределять.

function disable_emojis_tinymce() {
    // Содержимое функции.
}

Переопределение с помощью приоритета функций

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

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

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

Например:

function disable_emojis_tinymce() {
    // Содержимое функции.
}
add_action( 'init', 'disable_emojis_tinymce' );

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

Следовательно ваша функция будет иметь вид:

function disable_emojis_tinymce() {
    // Содержимое функции.
}
add_action( 'init', 'disable_emojis_tinymce', 15 );

Например, нужная вам функция в родительской теме имеет приоритет 20:

function disable_emojis_tinymce() {
    // Содержимое функции.
}
add_action( 'init', 'disable_emojis_tinymce', 20 );

Чтобы ее переопределить в дочерней теме, нужно просто понизить приоритет (увеличить число) ее выполнения:

function disable_emojis_tinymce() {
    // Содержимое функции.
}
add_action( 'init', 'disable_emojis_tinymce', 25 );

Переопределение с помощью удаления функции с хука

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

function disable_emojis_tinymce() {
    // Содержимое функции.
}
add_action( 'init', 'disable_emojis_tinymce' );

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

remove_action( 'init', 'disable_emojis_tinymce' );

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

function remove_disable_emojis_tinymce() {
    remove_action( 'init', 'disable_emojis_tinymce' );
}
add_action( 'wp_loaded', 'remove_disable_emojis_tinymce' );

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

Немного о приоритетах

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

function disable_emojis_tinymce() {
    // Содержимое функции.
}
add_action( 'init', 'disable_emojis_tinymce', 15 );

Для ее отвязки используется следующий код:

function remove_disable_emojis_tinymce() {
    remove_action( 'init', 'disable_emojis_tinymce' );
}
add_action( 'wp_loaded', 'remove_disable_emojis_tinymce', 15 );
Курс WordPress-разработчик
Если Вам понравилась статья — поделитесь с друзьями
Михаил Петров
Привет! Меня зовут Михаил Петров. Я копирайтер и занимаюсь этим с 2013 года. Скрупулезность и ответственность - моя фишка! Не могу делать как попало и добиваюсь, чтоб заказчик сказал минимум “неплохо”. За все время своей работы пришлось написать и отредактировать немало разной “текстовухи”, включая SEO-тексты, отзывы и прочую чушь. На сегодняшний день специализируюсь на написании информационных статей и руководств технического направления. Вижу смысл и светлое будущее в текстах для людей, а не для машин.