问题描述

任何人都可以解释为什么会有不断的通知

JQMIGRATE: Migrate is installed, version 1.4.0

当我将主题更新为 WordPress 4.5 时,我的控制台中指向 load-scripts.php,它如何被删除?

这不是一个错误,但它总是存在于我的控制台中,我真的不明白它的意义在哪里?我应该更新一些东西,对我的代码进行一些修改吗?

也许我有一点 ocd,但通常当我检查的网站,我喜欢看错误和真实的通知,指出我的控制台中的一个问题…

最佳解决方案

WordPress 使用 jQuery 迁移脚本确保您可能正在使用哪些使用从较新版本的 jQuery 中删除功能的任何插件或主题的向后兼容性。

随着 WordPress 4.5 的发布,它似乎已经升级了从 v1.2.1v1.4.0 的 jQuery 迁移的版本 – 快速扫描通过代码显示 v1.4.0 日志脚本被加载,无论 migrateMute 选项是否设置并且在未压缩和最小化的版本中。

删除通知的唯一方法是确保您的所有插件/主题代码不依赖任何旧的 jQuery 功能,然后删除迁移脚本。有一个 plugin 在这里做,但这是一个很简单的方法,可以放在你的主题的功能文件或类似的:

add_action( 'wp_default_scripts', function( $scripts ) {
    if ( ! empty( $scripts->registered['jquery'] ) ) {
        $scripts->registered['jquery']->deps = array_diff( $scripts->registered['jquery']->deps, array( 'jquery-migrate' ) );
    }
} );

请注意,这不是 WordPress 开发的最佳做法,在我看来,迁移脚本不应该仅仅是为了保持开发者控制台的清洁。

次佳解决方案

您可以在 jquery-migrate.min.js 中将日志消息文本更改为空白,但是在核心更新时不会保留该文本。

另一种方法是将 console.log 的直通/过滤功能副本添加到迁移脚本加载之前,并将其忽略包含 「Migrate is installed」 的日志记录消息。这样做会保留其他迁移警告:

// silencer script
function jquery_migrate_silencer() {
    // create function copy
    $silencer = '<script>window.console.logger = window.console.log; ';
    // modify original function to filter and use function copy
    $silencer .= 'window.console.log = function(tolog) {';
    // bug out if empty to prevent error
    $silencer .= 'if (tolog == null) {return;} ';
    // filter messages containing string
    $silencer .= 'if (tolog.indexOf("Migrate is installed") == -1) {';
    $silencer .= 'console.logger(tolog);} ';
    $silencer .= '}</script>';
    return $silencer;
}

// for the frontend, use script_loader_tag filter
add_filter('script_loader_tag','jquery_migrate_load_silencer', 10, 2);
function jquery_migrate_load_silencer($tag, $handle) {
    if ($handle == 'jquery-migrate') {
        $silencer = jquery_migrate_silencer();
        // prepend to jquery migrate loading
        $tag = $silencer.$tag;
    }
    return $tag;
}

// for the admin, hook to admin_print_scripts
add_action('admin_print_scripts','jquery_migrate_echo_silencer');
function jquery_migrate_echo_silencer() {echo jquery_migrate_silencer();}

结果是添加到前端和后端的一行 HTML 脚本实现了所需的效果 (防止已安装的消息) 。

第三种解决方案

这里只是一点点测试。

我偷看了 jquery-migrate.js,注意到这部分:

// Set to true to prevent console output; migrateWarnings still maintained
// jQuery.migrateMute = false;

所以我用新的 wp_add_inline_script()测试了以下版本,在 4.5 版本中引入:

add_action( 'wp_enqueue_scripts', function()
{
    wp_add_inline_script(
        'jquery-migrate', 'jQuery.migrateMute = true;',
        'before'
    );
} );

这将改变:

JQMIGRATE: Migrate is installed with logging active, version 1.4.0

至:

JQMIGRATE: Migrate is installed, version 1.4.0

所以它实际上并没有阻止所有的控制台输出,像 jquery-migrate.js 这样的部分:

// Show a message on the console so devs know we're active
if ( window.console && window.console.log ) {
    window.console.log( "JQMIGRATE: Migrate is installed" +
        ( jQuery.migrateMute ? "" : " with logging active" ) +
        ", version " + jQuery.migrateVersion );
}

参考文献

注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。