問題描述

任何人都可以解釋為什麼會有不斷的通知

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 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。