Удаление действия родительской темы для подключаемой функции не работает
Я пытаюсь удалить вызов add_action родительской темы для подключаемой функции, но не могу заставить работать remove_action() - приходится переопределять функцию и оставлять её пустой. Это нормально? Казалось бы, можно просто использовать remove_action, чтобы функция никогда не вызывалась.
Вот код родительской темы:
add_action( 'tha_content_while_before', 'fwp_archive_header' );
if ( !function_exists('fwp_archive_header') ) {
function fwp_archive_header() {
// выполняет действия
}
}
А в дочерней теме (НЕ работает):
add_action( 'init', 'remove_parent_actions_filters' );
function remove_parent_actions_filters() {
remove_action( 'tha_content_while_before', 'fwp_archive_header' );
}
Я также пробовал заменять 'init
' на 'after_setup_theme
' и 'wp_loaded
'; пробовал изменять приоритет - ничего не помогло. Единственное, что сработало:
В дочерней теме (работает):
function fwp_archive_header() {
// ничего не делать
}
Правильно ли, что приходится переопределять функцию, чтобы отключить её?
Спасибо!

Файл functions.php родительской темы выполняется после дочерней темы, поэтому для удаления действия, определенного родительской темой, вызов remove_action
должен быть отложен с использованием хука после того, как родительская тема зарегистрирует действие. Таким образом, простое размещение вызова remove_action
внутри functions.php дочерней темы не сработает. Он должен быть привязан к хуку.
Однако из приведенного фрагмента кода в вопросе не ясно, находится ли строка add_action( 'tha_content_while_before', 'fwp_archive_header' );
в родительской теме просто в functions.php или внутри другого действия? Если она находится внутри действия, привяжите вызов remove_action
к тому же хуку, но с более высоким приоритетом (чтобы он выполнился после). Обратите внимание, что речь идет о хуке, внутри которого находится вызов add_action
родительской темы. Например, так:
add_action( 'some_hook', 'some_parent_function', 10 );
function some_parent_function() {
/* ...какой-то код... */
add_action( 'tha_content_while_before', 'fwp_archive_header' );
if ( !function_exists('fwp_archive_header') ) {
function fwp_archive_header() {
// выполняемые действия
}
}
/* ...какой-то код... */
}
Удаление будет выглядеть так:
add_action( 'some_hook', 'remove_parent_actions_filters', 11 );
function remove_parent_actions_filters() {
remove_action( 'tha_content_while_before', 'fwp_archive_header' );
}
Другой эмпирический подход — привязать вызов удаления к хуку wp_loaded
, например: add_action( 'wp_loaded', 'remove_parent_actions_filters', 1000 );
. Это должно быть еще достаточно рано, чтобы повлиять на отображение страниц, но, скорее всего, достаточно поздно, чтобы переопределить большинство распространенных хуков родительской темы.
С другой стороны, объявление пустой функции с именем fwp_archive_header
— это почти такое же хорошее решение. Однако обратите внимание, что это не «переобъявление», так как в PHP такой вещи не существует. Это скорее «предварительное объявление» перед родительской темой, чтобы родительская тема не объявила свою собственную функцию с тем же именем (при наличии соответствующих проверок).

Спасибо! Понял. Функция add_action( 'tha_content_while_before', 'fwp_archive_header' ) родительской темы и связанная с ней функция находятся в файле functions.php, не обернутые в другую action/function. Я попробовал wp_loaded (а также init и after_setup_theme) с приоритетом 1000, но ничего не работает. Очень странно. Наверное, просто переопределю функцию как пустую. Спасибо!

Внутри вашей функции remove_parent_actions_filters() добавьте проверку, загружена ли функция родительской темы. Возможно, вы вызываете свой хук слишком рано.
add_action( 'init', 'remove_parent_actions_filters' );
function remove_parent_actions_filters() {
if (!function_exists('fwp_archive_header')) {wp_die("Функция fwp_archive_header не загружена");}
remove_action( 'tha_content_while_before', 'fwp_archive_header' );
}
Добавлено
Попробуйте использовать хук after_setup_theme вместо этого. Смотрите https://codex.wordpress.org/Plugin_API/Action_Reference/after_setup_theme .

Это действительно проблема - я получаю сообщение от wp_die при использовании вашего кода. Я попробовал изменить приоритет на очень высокий, например 1000: add_action( 'init', 'remove_parent_actions_filters',1000 ); но сообщение всё равно появляется. В замешательстве!

Вам нужно использовать хук, который срабатывает после загрузки родительского стиля. Или, возможно, после загрузки всех файлов стилей. Например, хук 'after_setup_theme': https://codex.wordpress.org/Plugin_API/Action_Reference/after_setup_theme .

Возможно ли, что функция, которую вы пытаетесь заменить, загружается позже (после настройки темы)? Возможно, это поможет: https://codex.wordpress.org/Plugin_API/Action_Reference . И это может быть отличным ресурсом (ответы) https://wordpress.stackexchange.com/questions/162862/how-to-get-wordpress-hooks-actions-run-sequence .
