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

Предупреждение: Не рекомендуется заменять основную версию 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' );
}

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

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

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

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

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

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

Я разработал плагин для решения этой конкретной проблемы. Плагин не вмешивается в 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:
// 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 );
