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';
}


Тот факт, что детская тема загружена в первую очередь, весьма практична, поскольку использование дочерней темы не заменяется, а скорее дополнением к основной теме.