更新到WordPress 4.5后,在控制台中出现令人讨厌的“ JQMIGRATE:迁移是…”


53

为什么会不断发出通知,

JQMIGRATE:已安装迁移版本1.4.0

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

这不是一个错误,但是它始终存在于我的控制台中,我真的不知道它的意义是什么。我应该更新某些内容还是对我的代码进行一些更改?

也许我有一些OCD,但是通常当我检查站点时,我喜欢看到错误和真实的提示,这些提示和提示指向控制台中的问题...


+1非常有用的强迫症。这可能来自jquery迁移/向后兼容性脚本。您有机会使用它的未缩小/开发版本吗?
Mark Kaplun

未缩小版本的迁移?不,据我所知,可能是某些插件,但是经检查,我没有看到任何插件:\
dingo_d

1
请注意,两个版本都在WP dirs中:/wp-admin/js/jquery/jquery-migrate.js/wp-admin/js/jquery/jquery-migrate.min.js
majick

Answers:


50

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

随着WordPress 4.5的发布,似乎他们已经将jQuery的版本从v1.2.1升级到了v1.4.0-快速浏览代码会发现v1.4.0记录了脚本是否已加载。migrateMute选项已设置,并且处于未压缩版本和最小版本。

删除通知的唯一方法是确保所有插件/主题代码都不依赖任何旧的jQuery功能,然后删除迁移脚本。有一个插件可以执行此操作,但这是一个非常简单的方法,可以将其放置在主题的功能文件或类似文件中:

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

请注意,这不是WordPress开发的最佳做法,我认为不应仅出于保持开发者控制台整洁的目的而删除迁移脚本。


因此,基本上我的一个插件依赖于旧jQuery版本中的一部分功能?有没有办法找出该功能是什么?还是我可以安全地将迁移脚本静音?
dingo_d

1
我不能肯定地说您的任何插件是否都依赖于旧功能,如果您的安装中有一段时间未更新任何插件,WordPress只是将迁移脚本作为安全默认值包含在内。如果是我的话我会删除的本地迁移脚本安装站点,然后检查一切仍然正常工作,确保有控制台等没有错误
刘德华

我建议不要这样做。这种向后兼容性是有原因的。与删除WordPress中已弃用的功能文件的jQuery等效。麻烦所有的工作来验证您当前的设置是否完全兼容,甚至不考虑设置或插件的更改,并且鉴于您将要创建的潜在问题,因此无法消除删除控制台日志消息的完全可疑的好处。 。
majick '16

1
@majick讨论删除脚本是否是一个好主意,超出了此答案的范围,它专门解决了如何在控制台中删除消息的问题。FWIW,我认为删除脚本也是一个坏主意。我认为毫无必要,因为我的回答很好地回答了OP的问题。
安迪

1
抱歉,我并不经常投票,但是没有必要警告说这可能不是一个好主意,这与开发中的最佳实践相反(添加警告,我将删除投票)。相信问题是在问如何仅删除控制台消息而不是如何删除jquery本身。如果有人问如何在WordPress中删除更新the消息,您将不会回答“仅卸载WordPress”。
majick '16

11

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

另一种方法是console.log在迁移脚本加载之前将的passthrough / filter函数副本添加到,并告诉它忽略包含' 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脚本添加到前端和后端,从而实现了预期的效果(防止安装消息)。


1
+1,但如果是您的网站,最好确保所有脚本都与最新版本兼容并删除迁移器;)
Mark Kaplun

是的,但是我完全不同意将迁移器作为一种实践来删除,因为它没有考虑安装可能与最新jQuery不兼容的主题/插件。作为一个并行工具,有许多插件仍然可以正常工作,即使它们可能尚未在此处意识到WordPress功能或已“正式”弃用。总体而言,向后兼容性是预防问题,而且比治愈方法要好。
majick '16

2
您是对的,但不支持最新的jquery版本是IMO错误。4.5大约一个月前进入RC,如果未对代码进行测试以使其能够进行所有引入的更改,则主题/插件不是真正兼容的。在外部,wordpress弃用消息有时会变成实际弃用,并且您不希望在必须尽快升级的情况下处理它们。IMO迁移器应该是一个临时解决方案,而不是永久性功能。
Mark Kaplun

2
我在这里不同意校长,互联网是一个快速发展的目标,而且格局一直在变化。(例如,在将网站徽标功能升级到4.5之前,网站已经从仅拥有一个徽标的想法转向了未来)。仅当应用于非常具体且稳定的细分市场时,Old才是好的,但是例如jQuery被认为是一个相对移动的目标。
马克·卡普伦

1
主题不是孤立的产品。如果一个主题包装了wordpress和jquery等,那么该主题的年龄将是完全相关的。由于没有主题,如果没有针对使用的wordpress版本对主题进行测试,那么还不清楚会发现哪种错误。这只是静态与动态链接困境的另一种表现。在静态链接的世界中,您的主张基本上是正确的,但wordpress是动态链接,仅因为某些东西曾与3.5一起工作并不意味着它即使与向后兼容也能与4.5一起工作
Mark Kaplun

7

这里只是一点测试。

我偷看了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:迁移已安装且日志记录处于活动状态,版本1.4.0

至:

JQMIGRATE:已安装迁移版本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 );
}

1
因此,底部代码只是删除了消息,对吗?我的意思是,迁移仍然存在,但消息被抑制了,对吗?这比绝对删除迁移要好
dingo_d 2016年

1
不,这是产生控制台日志消息输出的代码的副本。它显示仅对控制台消息的后半部分测试了migrateMute-不管是否输出前半部分…… 删除此代码块都将删除控制台消息,但是您需要重做每个WP更新。
majick

2
感谢您的研究和细节!IMO是最佳选择,因为删除JQmigrate并不总是一个好主意,因为许多WP插件都依赖不推荐使用的jQuery函数。该解决方案有助于清理控制台输出!
菲利普

1

解:

将此添加到functions.php:

function remove_jquery_migrate_notice() {
    $m= $GLOBALS['wp_scripts']->registered['jquery-migrate'];
    $m->extra['before'][]='temp_jm_logconsole = window.console.log; window.console.log=null;';
    $m->extra['after'][]='window.console.log=temp_jm_logconsole;';
}
add_action( 'init', 'remove_jquery_migrate_notice', 5 );

jquery-migrate使用标准钩子(输出<link rel=stylesheet....>)而不是load-scripts.php批量(如admin-dashboard)调用时,它可以工作。


1

有同样的问题,并发现你只需要设置SCRIPT_DEBUGfalsewp-config.php。希望这可以帮助某人


2
那对我没有用。
Serj Sagan

-1

如Andy先前所述,WordPress使用jQuery迁移脚本来确保向后兼容,这就是默认情况下会自动加载它的原因。

这是删除JQuery Migrate模块并摆脱烦人的JQMIGRATE通知的安全方法,同时可以加快客户端上页面的加载速度。只需将以下代码复制/粘贴到您的functions.php文件中,即可完成:

<?php
/**
 * Disable jQuery Migrate in WordPress.
 *
 * @author Guy Dumais.
 * @link https://en.guydumais.digital/disable-jquery-migrate-in-wordpress/
 */
add_filter( 'wp_default_scripts', $af = static function( &$scripts) {
    if(!is_admin()) {
        $scripts->remove( 'jquery');
        $scripts->add( 'jquery', false, array( 'jquery-core' ), '1.12.4' );
    }    
}, PHP_INT_MAX );
unset( $af );


更多细节

若要获取有关我使用的是静态函数的原因的详细信息,在这里阅读我的文章:
►► https://en.guydumais.digital/disable-jquery-migrate-in-wordpress/


2
拒绝投票的原因是:1.这闻起来太多了垃圾邮件,只是付出了最小的努力才觉得自己像个答案。2.硬编码使缓存无效化的版本。
马克·卡普伦'18

这很可惜,因为它是一种不错的方法,即使您add_filter实际使用它时也要使用它。
pcarvalho
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.