Переопределение функции в дочерней теме

24 мая 2014 г., 12:02:47
Просмотры: 14.3K
Голосов: 7

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

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

Я нашел временное решение: создал функцию с модифицированным именем, скопировал все файлы шаблонов (index.php и др.) в директорию дочерней темы и заменил вызовы функций. Теперь вызывается новая функция.

Это работает, но игнорирует любые обновления родительской темы.

Есть ли лучшее решение этой проблемы?

0
Все ответы на вопрос 2
3

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

if( !function_exists( 'function_name' )):

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

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

24 мая 2014 г. 12:14:44
Комментарии

Это именно то, что я сделал. Теперь я вижу, что это ошибка PHP, так как он не позволяет переопределение функций, в отличие от JavaScript.

Gergely Gergely
24 мая 2014 г. 12:22:25

Информация о хуках и фильтрах WordPress: https://codex.wordpress.org/Plugin_API

Jonathan Hult Jonathan Hult
26 сент. 2017 г. 00:34:30

Но разве функция не будет перезаписана при обновлении темы? Возможно, я не до конца понял ваши шаги - повторю: я копирую функцию, которую хочу обновить, и переименовываю оригинальную функцию. Затем, когда я обновляю тему, оригинальная функция снова получит своё исходное имя. Я что-то упускаю?

Victor Victor
27 авг. 2020 г. 12:05:34
1

Сначала вы можете удалить функцию с помощью

remove_filter( 'hook', 'function_name' );

а затем добавить функцию снова с новым именем и тем же хуком.

Например

    function remove_content_filter() {

       remove_filter( 'the_content', 'function_name' );

    }

    add_action( 'after_setup_theme', 'remove_content_filter' );

    function new_function_name( $output ) {
        //здесь какой-то код
        return $output;
    }

    add_filter( 'the_content', 'new_function_name' );
24 мая 2014 г. 13:22:56
Комментарии

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

Victor Victor
27 авг. 2020 г. 12:10:43