Wp_dequeue_script для дочерней темы для замены script
У меня есть дочерняя тема, и я могу добавить script, который я хочу использовать, чтобы заменить некоторые функции темы и заменить некоторые из кнопок.
Но я не могу удалить старую кнопку, чтобы они отображались друг на друга. Как удалить родительский js script?
вот мой function.php
для дочерней темы
function replace_scroll(){
// Remove the Default JavaScript
wp_dequeue_script( 'dp-js' );
// Add your own script
$js_url = get_bloginfo('stylesheet_directory') . '/js';
wp_enqueue_script('dp',"$js_url/dp1.scripts.js");
}
add_action( 'wp_enqueue_scripts', 'replace_scroll' );
Ответы
Ответ 1
Несколько вопросов здесь для начала
-
Вы должны использовать get_stylesheet_directory_uri()
для дочерних тем и get_template_directory_uri()
для родительских тем вместо функций get_bloginfo()
. Последнее медленнее и использует первые две функции
-
Сценарии и стили должны быть сняты с учета И и удалены, чтобы полностью удалить их из очереди
-
Приоритет важен. Вам нужно подключить функцию позже, чтобы убедиться, что стили и скрипты зарегистрированы до того, как вы их отмените, иначе это не сработает.
Решение:
Скопируйте родительский файл js в дочернюю тему и откройте его и внесите необходимые изменения. Сохраните файл
Теперь вам нужно удалить dequeue И, отменив родительский файл js, а затем введя в очередь новый файл js-темы для детей
Пример
/*
* Use any number above 10 for priority as the default is 10
* any number after 10 will load after
*/
add_action( 'wp_enqueue_scripts', 'my_custom_scripts', 100 );
function my_custom_scripts()
{
wp_dequeue_script( 'parent-script-handle' );
wp_deregister_script( 'parent-script-handle' );
// Now the parent script is completely removed
/*
* Now enqueue you child js file, no need to register if you are not
* doing conditional loading
*/
wp_enqueue_script( 'child-script-handle', get_stylesheet_directory_uri() . '/child-script.js' );
//Now we have done it correctly
}
Ответ 2
Тестирование с родительской темой Twenty 14, которая имеет это в файле functions.php
:
function twentyfourteen_scripts() {
// other enqueues
wp_enqueue_script( 'twentyfourteen-script', get_template_directory_uri() . '/js/functions.js', array( 'jquery' ), '20131209', true );
}
add_action( 'wp_enqueue_scripts', 'twentyfourteen_scripts' );
Действие wp_enqueue_scripts
не имеет объявленного приоритета, поэтому оно использует значение по умолчанию 10
.
Чтобы сделать работу dequeue, мы должны добавить более низкий приоритет в нашей дочерней теме functions.php
file:
function remove_twentyfourteen_scripts()
{
wp_dequeue_script( 'twentyfourteen-script' );
}
add_action( 'wp_enqueue_scripts', 'remove_twentyfourteen_scripts', 11 ); // <-- HERE
Ответ 3
Вам нужно выяснить, где родительская тема генерирует кнопки.
Если они создаются с помощью javascript, вы можете удалить из него script, который создает кнопки. Просто будьте осторожны, так как любой другой javascript в этом файле также будет удален. Если это проблема, лучший способ сделать это - скопировать js script в вашу папку темы, удалить часть, которую вы не хотите, удалить из оригинала и поставить в очередь ваш измененный script.
Как это сделать.
Чтобы удалить объект script, вам необходимо знать его дескриптор. Вот фантастический урок о том, как получить ручки скриптов, очень удобно. Подводя итог, если ссылка не работает:
Добавлен в файл functions.php
function wpcustom_inspect_scripts_and_styles() {
global $wp_scripts;
global $wp_styles;
// Runs through the queue scripts
foreach( $wp_scripts->queue as $handle ) :
$scripts_list .= $handle . ' | ';
endforeach;
// Runs through the queue styles
foreach( $wp_styles->queue as $handle ) :
$styles_list .= $handle . ' | ';
endforeach;
printf('Scripts: %1$s Styles: %2$s',
$scripts_list,
$styles_list);
}
add_action( 'wp_print_scripts', 'wpcustom_inspect_scripts_and_styles' );
Это напечатает список всех js и css, которые будут загружены на вашу страницу вверху. Если у вас возникли проблемы с разработкой какой бы то ни было, вы всегда можете использовать инспектора дома, например, в Chrome или firefox. На chrome - щелкните правой кнопкой мыши - проверьте элемент - Resources-Frames - URL вашего сайта - скрипты.
Это даст вам список всех скриптов и их местоположений.
Как только вы выяснили, какой script вам нужен, скопируйте его в свою тему и удалите часть, добавляющую кнопки.
Затем удалите ненужный script с помощью дескриптора, который мы нашли ранее, и запустим новый.
function wpcustom_deregister_scripts_and_styles(){
wp_deregister_script('my-script-handle');
wp_enqueue_script( 'my-new-script', get_template_directory_uri() . '/js/my-new-script.js', array(), '1.0', true );
}
add_action( 'wp_print_styles', 'wpcustom_deregister_scripts_and_styles', 100 );
Если кнопки генерируются php, вам нужно найти файл, который генерирует html в родительской теме, скопировать его в вашу дочернюю тему и удалить строки нарушения.
Ответ 4
Я хочу добавить, что нам нужно использовать get_stylesheet_directory_uri()
при добавлении замены script, потому что get_template_directory_uri()
возвращает родительский каталог темы.
Смотрите документы WordPress здесь
Ответ 5
В типичном потоке wordpress перед темой загружаются плагины, а в случае дочерней темы дочерняя тема загружается перед родительской темой, в частности, файл functions.php
дочерней темы включен перед функциями functions.php родитель. Таким образом, действия wp_enqueue_scripts
укладываются в стек, а затем выполняются в этом порядке, если приоритет действий не определяется иначе, чем значение по умолчанию (10). Проблема здесь в том, что вы пытаетесь удалить из очереди script, который еще не был установлен в очередь.
Чтобы удалить добавленный родителем script, повысите приоритет действия wp_enqueue_scripts
дочерней темы до значения выше значения, определенного в действии родительской темы.
// get_template_directory_uri(), if used in child theme, the parent theme directory URI will be returned,
// use get_stylesheet_directory_uri() to get the child theme directory uri
add_action( 'wp_enqueue_scripts', 'child_theme_enqueue_scripts', 11 );
function child_theme_enqueue_scripts()
{
wp_dequeue_script( 'parent-theme-script' );
wp_enqueue_script( 'child-theme-script', get_stylesheet_directory_uri() . '/js/script.js' );
}
Чтобы заменить script, например, вы хотите внести некоторые изменения и оставить существующие зависимости и локализацию двумя способами.
Используйте wp_enqueue_script
с тем же именем handle
, из-за того, что если вы попытаетесь зарегистрировать или зарегистрировать уже зарегистрированный дескриптор, новые параметры будут проигнорированы, полезно, если script позже будет локализован родителем сохраняйте локализованные данные.
// default priority 10
add_action( 'wp_enqueue_scripts', 'child_theme_enqueue_scripts' );
function child_theme_enqueue_scripts()
{
wp_enqueue_script( 'parent-theme-script', get_stylesheet_directory_uri() . '/js/script.js' );
}
Использовать глобальный объект $wp_scripts
для изменения только необходимых свойств, например, изменить только свойство src
уже зарегистрированного или зарегистрированного script.
// priority 11
add_action( 'wp_enqueue_scripts', 'child_theme_enqueue_scripts', 11 );
function child_theme_enqueue_scripts()
{
global $wp_scripts;
$wp_scripts->registered[ 'parent-theme-script' ]->src = get_stylesheet_directory_uri() . '/js/script.js';
}
Тот факт, что детская тема загружена в первую очередь, весьма практична, поскольку использование дочерней темы не заменяется, а скорее дополнением к основной теме.