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

28 июл. 2020 г., 20:31:28
Просмотры: 286
Голосов: 0

Я пытаюсь удалить вызов 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() {
  // ничего не делать
}

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

Спасибо!

2
Комментарии

Пробовали ли вы разместить remove_action вне функции 'remove'? Просто в вашей дочерней теме > functions.php? Просто предположение... remove_action может быть сложным.

shanebp shanebp
28 июл. 2020 г. 20:42:29

@shanebp Да, это не работает, когда вынесено за пределы функции. Я полагаю, чтобы переопределить вызов родительской темы, его нужно подключить либо к init, либо к after_theme_setup.

Michelle Michelle
28 июл. 2020 г. 21:05:25
Все ответы на вопрос 2
2

Файл 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 такой вещи не существует. Это скорее «предварительное объявление» перед родительской темой, чтобы родительская тема не объявила свою собственную функцию с тем же именем (при наличии соответствующих проверок).

28 июл. 2020 г. 23:28:36
Комментарии

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

Michelle Michelle
29 июл. 2020 г. 00:17:30

Доступна ли эта тема для изучения? Просмотр кода или фактическая проверка, почему вызов remove action не срабатывает с помощью отладчика, будет следующим шагом в поиске проблемы!

Bence Szalai Bence Szalai
29 июл. 2020 г. 14:56:28
4

Внутри вашей функции 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 .

28 июл. 2020 г. 20:57:56
Комментарии

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

Michelle Michelle
28 июл. 2020 г. 21:05:28

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

Rick Hellewell Rick Hellewell
29 июл. 2020 г. 00:03:13

Попробовал это, не сработало.

Michelle Michelle
29 июл. 2020 г. 00:09:00

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

Rick Hellewell Rick Hellewell
30 июл. 2020 г. 01:50:41