Вопрос или проблема
Тема 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) не работает. Чтобы воспроизвести:
- Установите новый сайт WordPress локально.
- Установите тему Blank Slate (ссылка выше).
- Создайте дочернюю тему, которая включает файлы ниже этого списка.
- Установите дочернюю тему как тему сайта.
- Перейдите на любую страницу сайта и проверьте 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 );
Объяснение кода:
- Функция
my_child_enqueue_styles
подключает стили родительской темы, что является стандартной практикой для дочерней темы. - Новый хук
add_action( 'wp_footer', ...)
добавляет анонимную функцию на хукwp_footer
с приоритетом9
. Это позволяет выполнитьremove_action()
до добавления действияblankslate_footer
, так как у него приоритет по умолчанию10
.
Таким образом, когда WordPress обрабатывает хук wp_footer
, он сначала выполнит вашу функцию с приоритетом 9
, которая удалит blankslate_footer
, прежде чем она будет добавлена с приоритетом 10
.
После внесения предложенных изменений, проверьте HTML-код ваших страниц: скрипт jQuery должен исчезнуть, и проблема должна быть решена. Если у вас возникнут дополнительные вопросы или потребуется дальнейшая помощь, не стесняйтесь обращаться.