我运行WordPress版本4.7.2。它使用jQuery 1.12版。我需要将此版本更新为更高版本。我以前用新版本替换过它,但是当我升级WordPress核心时,又用1.12替换了。
如何更改WordPress永久使用的jQuery版本?

#1 楼


警告:您不应该替换核心jQuery版本,尤其是在管理面板中。由于许多WordPress核心功能可能取决于版本。另外,其他插件可能取决于内核中添加的jQuery版本。


如果您确定要更改内核jQuery版本,在这种情况下,您可以添加以下代码在活动主题的functions.php文件中(如果您为此创建了一个插件,甚至会更好):

function replace_core_jquery_version() {
    wp_deregister_script( 'jquery' );
    // Change the URL if you want to load a local copy of jQuery from your own server.
    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版本,而是从Google的服务器加载3.1.1版本。

此外,尽管不建议这样做,您也可以使用以下附加的CODE行替换wp-admin中的jQuery版本:

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


评论


如果发现它破坏了您的主题,您能只从functions.php中删除该操作吗?它将恢复为原始的jQuery版本还是这是永久更改?

–尼克
18年8月23日在16:54



如果wp_enqueue_scripts操作的回调函数仅更新jQuery,并且jQuery从其他地方入队,则删除该操作将还原原始jQuery。但是,有时浏览器会根据服务器缓存设置缓存旧的CODE,因此,您需要在清除浏览器缓存后才能看到更改。

–法亚兹
18年8月23日在17:37

好的,谢谢,我只是想确保在添加此操作之前没有弄乱我的网站。我有一种感觉,您所说的是准确的,但我想放心一点。

–尼克
18年8月23日在17:39

这显然不是永久性的,因为此更改取决于CODE本身,因此数据库中不会保存任何内容。因此,删除相关的CODE将恢复为旧状态。

–法亚兹
18年8月23日在17:39

当插件/主题要求版本低于1.12时,3.x版本的迁移脚本不起作用。有关此的更多信息,请访问:wordpress.stackexchange.com/a/244543/75495

– cjbj
18-10-24在13:55



#2 楼

我已经针对此特定问题开发了一个插件。该插件不会与WordPress jQuery混淆,因为它仅加载在前端。请参阅:适用于WordPress的jQuery Manager


为什么还要使用另一个jQuery Updater / Manager / Developer / Debugging工具?

因为没有开发人员工具允许您选择特定的
版本的jQuery和/或jQuery Migrate。同时提供生产版本和缩小版本。

✅仅在前端执行,不会干扰WordPress
admin / backend和WP customr(出于兼容性原因)请参见:
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-migrate加载jquery-core的别名查看更多有关别名的信息:wp_register_script多个标识符? br />

正确的方法

在下面的示例中,我使用https://code.jquery.com上的官方jQuery CDN,也使用script_loader_tag,因此我可以添加一些CDN属性。
您可以使用以下代码:

// Front-end not excuted in the wp admin and the wp customizer (for compatibility reasons)
// See: https://core.trac.wordpress.org/ticket/45130 and 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 'We are in the WP Admin or in the WP Customizer';
        return;
    }
    else {
        // Deregister WP core jQuery, see https://github.com/Remzi1993/wp-jquery-manager/issues/2 and https://github.com/WordPress/WordPress/blob/91da29d9afaa664eb84e1261ebb916b18a362aa9/wp-includes/script-loader.php#L226
        wp_deregister_script( 'jquery' ); // the jquery handle is just an alias to load jquery-core with jquery-migrate
        // Deregister WP jQuery
        wp_deregister_script( 'jquery-core' );
        // Deregister WP jQuery Migrate
        wp_deregister_script( 'jquery-migrate' );

        // Register jQuery in the head
        wp_register_script( 'jquery-core', 'https://code.jquery.com/jquery-3.3.1.min.js', array(), null, false );

        /**
         * Register jquery using jquery-core as a dependency, so other scripts could use the jquery handle
         * see https://wordpress.stackexchange.com/questions/283828/wp-register-script-multiple-identifiers
         * We first register the script and afther that we enqueue it, see why:
         * 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 );