Невозможно удалить действие из родительской темы через дочернюю тему.

Вопрос или проблема

Тема Blank Slate (в файле functions.php) добавляет jQuery скрипт на каждую страницу, который я хотел бы удалить:

<?php
/* ... */
add_action( 'wp_footer', 'blankslate_footer' );
function blankslate_footer() {
?>
<script>
jQuery(document).ready(function($) {
var deviceAgent = navigator.userAgent.toLowerCase();
if (deviceAgent.match(/(iphone|ipod|ipad)/)) {
$("html").addClass("ios");
$("html").addClass("mobile");
}
if (deviceAgent.match(/(Android)/)) {
$("html").addClass("android");
$("html").addClass("mobile");
}
if (navigator.userAgent.search("MSIE") >= 0) {
$("html").addClass("ie");
}
else if (navigator.userAgent.search("Chrome") >= 0) {
$("html").addClass("chrome");
}
else if (navigator.userAgent.search("Firefox") >= 0) {
$("html").addClass("firefox");
}
else if (navigator.userAgent.search("Safari") >= 0 && navigator.userAgent.search("Chrome") < 0) {
$("html").addClass("safari");
}
else if (navigator.userAgent.search("Opera") >= 0) {
$("html").addClass("opera");
}
});
</script>
<?php
}

Использование remove_action с тем же именем хука, тем же именем обратного вызова и той же приоритетностью (по умолчанию 10) не работает. Чтобы воспроизвести:

  1. Установите новый сайт WordPress локально.
  2. Установите тему Blank Slate (ссылка выше).
  3. Создайте дочернюю тему, которая включает файлы ниже этого списка.
  4. Установите дочернюю тему как тему сайта.
  5. Перейдите на любую страницу сайта и проверьте HTML на наличие вышеупомянутого jQuery скрипта.

style.css:

/**
 * Название темы: Дочерняя тема Blank Slate
 * Шаблон:   blankslate
 */

functions.php:

<?php
    // Подключение стилевого файла дочерней темы
    add_action( 'wp_enqueue_scripts', 'my_child_enqueue_styles' );
    function my_child_enqueue_styles() {
        wp_enqueue_style( 'blankslate-style', get_template_directory_uri() . '/style.css' );
    }

    // Удаление скрипта подвала
    remove_action( 'wp_footer', 'blankslate_footer' );

Я также попытался явно указать приоритет 10, с тем же результатом:

remove_action( 'wp_footer', 'blankslate_footer', 10 );

Есть какие-нибудь мысли, как это исправить? Заранее большое спасибо!

Файл functions.php дочерней темы загружается перед файлом functions.php родительской темы:

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

Источник:
https://developer.wordpress.org/themes/advanced-topics/child-themes/#using-functions-php

Это означает, что когда вызывается remove_action() дочерней темы, действия, которые нужно удалить, нет. Чтобы обойти это, попробуйте следующее в functions.php дочерней темы (не тестировалось):

add_action( 'wp_footer', static function () {
    remove_action( 'wp_footer', 'blankslate_footer', 10 );
}, 9 );

Это должно сработать, потому что оно подключается к тому же действию с более ранним приоритетом и удаляет хуки (если они существуют).

Ответ или решение

Для устранения проблемы с удалением действия из родительской темы с помощью дочерней темы, вам необходимо учесть, что функции в файлах functions.php дочерней и родительской тем загружаются последовательно, причем functions.php дочерней темы загружается перед functions.php родительской темы. Это означает, что вызов remove_action() в дочерней теме будет выполнен до того, как будет добавлено действие blankslate_footer.

Чтобы решить эту проблему, вы можете использовать другой хук с использованием функции add_action. Обратите внимание на следующий код, который должен быть добавлен в файл functions.php вашей дочерней темы:

<?php
// Подключение стилей дочерней темы
add_action( 'wp_enqueue_scripts', 'my_child_enqueue_styles' );
function my_child_enqueue_styles() {
    wp_enqueue_style( 'blankslate-style', get_template_directory_uri() . '/style.css' );
}

// Удаление скрипта из родительской темы
add_action( 'wp_footer', function() {
    remove_action( 'wp_footer', 'blankslate_footer', 10 );
}, 9 );

Объяснение кода:

  1. Функция my_child_enqueue_styles подключает стили родительской темы, что является стандартной практикой для дочерней темы.
  2. Новый хук add_action( 'wp_footer', ...) добавляет анонимную функцию на хук wp_footer с приоритетом 9. Это позволяет выполнить remove_action() до добавления действия blankslate_footer, так как у него приоритет по умолчанию 10.

Таким образом, когда WordPress обрабатывает хук wp_footer, он сначала выполнит вашу функцию с приоритетом 9, которая удалит blankslate_footer, прежде чем она будет добавлена с приоритетом 10.

После внесения предложенных изменений, проверьте HTML-код ваших страниц: скрипт jQuery должен исчезнуть, и проблема должна быть решена. Если у вас возникнут дополнительные вопросы или потребуется дальнейшая помощь, не стесняйтесь обращаться.

Оцените материал
Добавить комментарий

Капча загружается...