Обновление версии jQuery

21 февр. 2017 г., 11:02:03
Просмотры: 68.6K
Голосов: 38

У меня установлен WordPress версии 4.7.2, и он использует jQuery версии 1.12. Мне нужно обновить эту версию до более новой. Я уже заменял её на новую версию ранее, но когда я обновляю ядро WordPress, она снова заменяется на 1.12. Как я могу изменить версию jQuery, которую использует WordPress, на постоянной основе?

0
Все ответы на вопрос 2
7
47

Предупреждение: Не рекомендуется заменять основную версию jQuery, особенно в админ-панели. Так как многие функции WordPress могут зависеть от этой версии. Также другие плагины могут зависеть от версии jQuery, которая идет в комплекте с WordPress.

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

function replace_core_jquery_version() {
    wp_deregister_script( 'jquery' );
    // Измените URL, если хотите загрузить локальную копию jQuery со своего сервера
    wp_register_script( 'jquery', "https://code.jquery.com/jquery-3.1.1.min.js", array(), '3.1.1' );
}
add_action( 'wp_enqueue_scripts', 'replace_core_jquery_version' );

Это заменит основную версию jQuery и вместо нее будет загружена версия 3.1.1 с серверов jQuery.

Также, хотя это не рекомендуется, вы можете использовать дополнительную строку кода для замены версии jQuery в wp-admin:

add_action( 'admin_enqueue_scripts', 'replace_core_jquery_version' );

Таким образом, даже после обновления WordPress у вас останется желаемая версия jQuery.

Немного улучшенная функция:

Функция replace_core_jquery_version, приведенная выше, также удаляет скрипт jquery-migrate, добавленный ядром WordPress. Это разумно, потому что новая версия jQuery не будет корректно работать со старой версией jquery-migrate. Однако вы можете включить и новую версию jquery-migrate. В этом случае используйте следующую функцию:

function replace_core_jquery_version() {
    wp_deregister_script( 'jquery-core' );
    wp_register_script( 'jquery-core', "https://code.jquery.com/jquery-3.1.1.min.js", array(), '3.1.1' );
    wp_deregister_script( 'jquery-migrate' );
    wp_register_script( 'jquery-migrate', "https://code.jquery.com/jquery-migrate-3.0.0.min.js", array(), '3.0.0' );
}
21 февр. 2017 г. 15:16:12
Комментарии

Можно ли просто удалить action из functions.php, если выяснится, что он ломает тему? Вернётся ли оригинальная версия jQuery или это постоянное изменение?

Nick Nick
23 авг. 2018 г. 19:54:02

Если callback-функция действия wp_enqueue_scripts только обновляет jQuery, а jQuery подключается откуда-то ещё, то удаление действия восстановит оригинальный jQuery. Однако иногда браузеры кешируют старый КОД, в зависимости от настроек кеширования сервера. Поэтому после этого вам нужно будет очистить кеш браузера, чтобы увидеть изменения.

Fayaz Fayaz
23 авг. 2018 г. 20:37:25

Ок, спасибо, я просто хотел убедиться, что не испорчу свой сайт перед добавлением этого действия. Я чувствовал, что вы правы, но хотел перестраховаться.

Nick Nick
23 авг. 2018 г. 20:39:13

Это, очевидно, не является постоянным, так как это изменение зависит от самого КОДА, ничего не сохраняется в базе данных. Поэтому удаление соответствующего КОДА вернёт всё в исходное состояние.

Fayaz Fayaz
23 авг. 2018 г. 20:39:28

Скрипт миграции для версий 3.x не работает, когда плагины/темы ожидают версию ниже 1.12. Подробнее об этом здесь: https://wordpress.stackexchange.com/a/244543/75495

cjbj cjbj
24 окт. 2018 г. 16:55:51

@cjbj конечно, это так. Однако вопрос был о переходе с 1.12, поэтому очевидно, что ответ не охватывает этот случай.

Fayaz Fayaz
24 окт. 2018 г. 18:18:02

К сожалению, похоже не работает в WordPress 5. Старый Jquery выгружается, но новый не загружается.

TelFiRE TelFiRE
5 мар. 2020 г. 07:18:57
Показать остальные 2 комментариев
0
17

Я разработал плагин для решения этой конкретной проблемы. Плагин не вмешивается в jQuery WordPress, так как он загружается только во фронтенде. Смотрите: jQuery Manager for WordPress

Почему ещё один инструмент для обновления / управления / разработки / отладки jQuery?

Потому что ни один из существующих инструментов не позволяет выбрать конкретную версию jQuery и/или jQuery Migrate, предоставляя как production, так и minified версии. Смотрите возможности ниже!

✅ Выполняется только во фронтенде, не влияет на админку WordPress и кастомайзер (по соображениям совместимости). Смотрите: https://core.trac.wordpress.org/ticket/45130 и https://core.trac.wordpress.org/ticket/37110

Включение/выключение jQuery и/или jQuery Migrate

✅ Активация определённой версии jQuery и/или jQuery Migrate

И многое другое! Код открыт, так что вы можете изучать его, учиться и вносить свой вклад.


Почти все используют неправильный хэндл

WordPress на самом деле использует хэндл jquery-core, а не jquery:

https://github.com/WordPress/WordPress/blob/91da29d9afaa664eb84e1261ebb916b18a362aa9/wp-includes/script-loader.php#L226

// jQuery
$scripts->add( 'jquery', false, array( 'jquery-core', 'jquery-migrate' ), '1.12.4' );
$scripts->add( 'jquery-core', '/wp-includes/js/jquery/jquery.js', array(), '1.12.4' );
$scripts->add( 'jquery-migrate', "/wp-includes/js/jquery/jquery-migrate$suffix.js", array(), '1.4.1' );

Хэндл jquery — это просто алиас для загрузки jquery-core вместе с jquery-migrate

Подробнее об алиасах: wp_register_script multiple identifiers?

Правильный способ решения

В моём примере ниже я использую официальный CDN jQuery на https://code.jquery.com. Также я использую script_loader_tag, чтобы добавить атрибуты CDN.
Вы можете использовать следующий код:

// Фронтенд, не выполняется в админке и кастомайзере WordPress (по соображениям совместимости)
// Смотрите: https://core.trac.wordpress.org/ticket/45130 и https://core.trac.wordpress.org/ticket/37110
function wp_jquery_manager_plugin_front_end_scripts() {
    $wp_admin = is_admin();
    $wp_customizer = is_customize_preview();

    // jQuery
    if ( $wp_admin || $wp_customizer ) {
        // echo 'Мы в админке WordPress или в кастомайзере';
        return;
    }
    else {
        // Разрегистрируем ядро jQuery WordPress, см. https://github.com/Remzi1993/wp-jquery-manager/issues/2 и https://github.com/WordPress/WordPress/blob/91da29d9afaa664eb84e1261ebb916b18a362aa9/wp-includes/script-loader.php#L226
        wp_deregister_script( 'jquery' ); // хэндл jquery — это просто алиас для загрузки jquery-core с jquery-migrate
        // Разрегистрируем jQuery WordPress
        wp_deregister_script( 'jquery-core' );
        // Разрегистрируем jQuery Migrate WordPress
        wp_deregister_script( 'jquery-migrate' );

        // Регистрируем jQuery в head
        wp_register_script( 'jquery-core', 'https://code.jquery.com/jquery-3.3.1.min.js', array(), null, false );

        /**
         * Регистрируем jquery, используя jquery-core как зависимость, чтобы другие скрипты могли использовать хэндл jquery
         * см. https://wordpress.stackexchange.com/questions/283828/wp-register-script-multiple-identifiers
         * Сначала регистрируем скрипт, а затем подключаем его, см. почему:
         * https://wordpress.stackexchange.com/questions/82490/when-should-i-use-wp-register-script-with-wp-enqueue-script-vs-just-wp-enque
         * https://stackoverflow.com/questions/39653993/what-is-diffrence-between-wp-enqueue-script-and-wp-register-script
         */
        wp_register_script( 'jquery', false, array( 'jquery-core' ), null, false );
        wp_enqueue_script( 'jquery' );
    }
}
add_action( 'wp_enqueue_scripts', 'wp_jquery_manager_plugin_front_end_scripts' );


function add_jquery_attributes( $tag, $handle ) {
    if ( 'jquery-core' === $handle ) {
        return str_replace( "type='text/javascript'", "type='text/javascript' integrity='sha256-FgpCb/KJQlLNfOu91ta32o/NMZxltwRo8QtmkMRdAu8=' crossorigin='anonymous'", $tag );
    }
    return $tag;
}
add_filter( 'script_loader_tag', 'add_jquery_attributes', 10, 2 );
1 июл. 2019 г. 22:15:53