Mengganggu "JQMIGRATE: Migrate is ..." di konsol setelah pembaruan ke WordPress 4.5

53

Mengapa ada pemberitahuan konstan,

JQMIGRATE: Migrasi diinstal, versi 1.4.0

yang menunjuk ke load-scripts.phpkonsol saya ketika saya memperbarui tema saya ke WordPress 4.5, dan bagaimana cara menghapusnya?

Ini bukan kesalahan, tapi selalu ada di konsol saya, dan saya benar-benar tidak mengerti apa gunanya. Haruskah saya memperbarui sesuatu, atau membuat beberapa perubahan pada kode saya?

Mungkin saya memiliki sedikit OCD, tetapi biasanya ketika saya memeriksa situs tersebut, saya suka melihat kesalahan dan pemberitahuan nyata yang mengarah ke masalah di konsol saya ...

dingo_d
sumber
Beri +1 ke OCD Anda yang sangat berguna. Ini mungkin berasal dari skrip migrasi jquery migrasi / kompatibilitas. Adakah kemungkinan Anda menggunakan versi yang tidak ditiru / dev itu?
Mark Kaplun
Versi migrasi yang tidak tuntas? Setahu saya tidak, ini bisa berupa beberapa plugin, tetapi setelah diperiksa saya tidak melihatnya: \
dingo_d
1
perhatikan kedua versi dalam WP dirs: /wp-admin/js/jquery/jquery-migrate.jsand/wp-admin/js/jquery/jquery-migrate.min.js
majick

Jawaban:

50

WordPress menggunakan skrip migrasi jQuery untuk memastikan kompatibilitas mundur untuk setiap plugin atau tema yang mungkin Anda gunakan yang menggunakan fungsionalitas yang dihapus dari versi jQuery yang lebih baru.

Dengan rilis WordPress 4.5, tampaknya mereka telah memutakhirkan versi jQuery yang bermigrasi dari v1.2.1 ke v1.4.0 - Setelah pemindaian cepat melalui kode tersebut akan terungkap bahwa v1.4.0 mencatat bahwa skrip dimuat tanpa memperhatikan apakah atau tidak migrateMuteopsi diatur dan di kedua versi terkompresi dan diperkecil.

Satu-satunya cara untuk menghapus pemberitahuan adalah memastikan bahwa semua plugin / kode tema Anda tidak bergantung pada fungsionalitas jQuery lama, dan kemudian menghapus skrip migrasi. Ada plugin di luar sana untuk melakukan ini, tetapi ini adalah metode yang cukup sederhana yang hanya dapat ditempatkan di file fungsi tema Anda atau serupa:

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

Harap perhatikan bahwa ini tidak dianggap praktik terbaik untuk pengembangan WordPress dan menurut saya skrip migrasi tidak boleh dihapus hanya demi menjaga konsol pengembang tetap bersih.

Andy
sumber
Jadi pada dasarnya salah satu plugin saya tergantung pada fungsi yang merupakan bagian dari versi jQuery lama? Apakah ada cara untuk mengetahui apa fungsi itu? Atau apakah saya aman untuk membisukan skrip migrasi?
dingo_d
1
Saya tidak bisa mengatakan dengan pasti apakah salah satu plugin Anda bergantung pada fungsionalitas yang lama, WordPress hanya menyertakan skrip migrasi sebagai default aman jika instalasi Anda memiliki plugin yang belum diperbarui dalam beberapa saat. Jika itu saya, saya akan menghapus skrip migrasi pada pemasangan lokal situs dan kemudian memeriksa semuanya masih berfungsi seperti yang diharapkan, memastikan tidak ada kesalahan di konsol dll.
Andy
Saya merekomendasikan ini. Kompatibilitas mundur ini ada karena suatu alasan. Ini adalah jQuery yang setara dengan menghapus file fungsi yang tidak digunakan lagi di WordPress. Pergi ke semua kesulitan memverifikasi apakah pengaturan Anda saat ini sepenuhnya kompatibel bahkan tidak memperhitungkan perubahan pengaturan atau penambahan plugin, dan mengingat potensi masalah yang Anda buat tidak seimbang dengan manfaat yang sepenuhnya meragukan dari menghapus pesan log konsol .
Majick
1
@majick Ini di luar cakupan jawaban ini untuk membahas apakah menghapus skrip adalah ide yang bagus atau tidak, ini secara khusus membahas masalah bagaimana menghapus pesan di konsol. FWIW, saya pikir menghapus skrip adalah ide yang buruk juga. Saya pikir downvote tidak pantas, karena jawaban saya dengan sempurna menjawab pertanyaan OPs.
Andy
1
maaf saya tidak sering downvote, tetapi merasa dibutuhkan di sini karena tidak ada peringatan bahwa ini mungkin bukan ide yang baik dan merupakan kebalikan dari praktik terbaik dalam pengembangan (tambahkan peringatan dan saya akan menghapus downvote.) I percaya pertanyaannya adalah bertanya bagaimana cara menghapus hanya pesan konsol bukan bagaimana menghapus jquery bermigrasi sendiri. jika seseorang bertanya bagaimana cara menghapus pesan nag pembaruan di WordPress Anda tidak akan menjawab "uninstall saja WordPress."
Majick
11

Anda bisa mengubah teks pesan log menjadi kosong jquery-migrate.min.jstetapi ini tidak akan dipertahankan pada pembaruan inti.

Alternatifnya adalah menambahkan salinan fungsi passthrough / filter console.logke tepat sebelum skrip migrasi dimuat, dan katakan itu untuk mengabaikan logging logging pesan yang berisi ' Migrate is installed'. Melakukannya dengan cara ini akan mempertahankan peringatan Migrasi lainnya juga:

// 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();}

Hasilnya adalah satu baris skrip HTML yang ditambahkan ke frontend dan backend yang mencapai efek yang diinginkan (mencegah pesan yang diinstal.)

majik
sumber
1
Memberi +1 untuk gagasan itu, tetapi jika itu adalah situs Anda, mungkin lebih baik memastikan bahwa semua skrip Anda kompatibel dengan versi terbaru dan menghapus migrator;)
Mark Kaplun
ya tapi saya sama sekali tidak setuju dengan menghapus migrator sebagai praktik sama sekali karena tidak mempertimbangkan menginstal tema / plugin yang mungkin belum kompatibel dengan jQuery terbaru. sebagai paralel ada banyak plugin yang masih berfungsi dengan baik meskipun mereka mungkin tidak menyadari fungsi WordPress di sini atau ada "secara resmi" sudah usang. kompatibilitas ke belakang adalah pencegahan dan lebih baik daripada penyembuhan ketika datang ke kedua kasus dan baik, perangkat lunak pada umumnya.
Majick
2
Anda benar, tetapi tidak mendukung versi jquery terbaru adalah bug IMO. 4.5 masuk ke RC sekitar sebulan yang lalu, dan jika kode tidak diuji untuk bekerja dengan semua perubahan yang diperkenalkan, maka tema / plugin tidak benar-benar kompatibel. Di dunia di luar pesan penghentian wordpress berubah menjadi penghentian aktual di beberapa titik, dan Anda tidak ingin meninggalkan penanganannya ke waktu di mana Anda harus meningkatkan ASAP. IMO migrator harus menjadi solusi sementara, bukan fitur permanen.
Mark Kaplun
2
Saya tidak setuju dengan prinsipal di sini, internet adalah target yang bergerak cepat dan lanskap berubah sepanjang waktu. (pada saat diperlukan untuk membuat fitur logo situs menjadi 4,5 misalnya, situs telah beralih dari gagasan hanya memiliki satu logo). Lama hanya baik bila diterapkan pada relung yang sangat spesifik dan stabil, tetapi jQuery misalnya diketahui sebagai target yang relatif bergerak.
Mark Kaplun
1
Tema bukanlah produk yang terisolasi. Jika sebuah tema mengemas wordpress dan jquery dll, maka usia tema akan sangat relevan. Karena tidak ada tema yang melakukan hal itu, jika tema tersebut tidak diuji terhadap versi wordpress yang digunakan, maka tidak cukup jelas jenis bug apa yang akan ditemukan. Ini hanyalah manifestasi dari dilema statis vs dinamis yang menghubungkan. Dalam dunia penghubung statis klaim Anda sebagian besar benar, tetapi wordpress adalah penghubung dinamis dan hanya karena sesuatu telah bekerja dengan 3,5 tidak berarti itu akan bekerja dengan 4,5 bahkan dengan upaya untuk menjadi kompatibel kembali
Mark Kaplun
7

Hanya sedikit tes di sini.

Saya mengintip ke jquery-migrate.js dan memperhatikan bagian ini:

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

jadi saya menguji yang berikut dengan yang baru wp_add_inline_script(), diperkenalkan di versi 4.5:

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

Ini akan berubah:

JQMIGRATE: Migrasi diinstal dengan logging aktif, versi 1.4.0

untuk:

JQMIGRATE: Migrasi diinstal, versi 1.4.0

Jadi itu tidak benar-benar mencegah semua output konsol, seperti bagian ini di 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 );
}
birgire
sumber
1
Jadi kode dasarnya hanya menghapus pesan, bukan? Maksud saya, migrasi tetap tetapi pesannya ditekan, bukan? Ini lebih baik daripada menghapus migrasi
dingo_d
1
tidak, itu adalah salinan dari kode memproduksi konsol log pesan yang tidak output. itu menunjukkan bahwa migrateMute hanya diuji untuk bagian kedua dari pesan konsol - bagian pertama adalah output terlepas ... menghapus blok kode ini akan menghapus pesan konsol, tetapi Anda harus mengulang bahwa setiap pembaruan WP.
Majick
2
Terima kasih atas penelitian dan detailnya! IMO pilihan terbaik, karena menghapus JQmigrate tidak selalu merupakan ide yang baik, karena banyak plugin WP bergantung pada fungsi jQuery yang sudah tidak digunakan lagi. Solusi ini membantu membersihkan keluaran konsol sedikit!
Philipp
1

Larutan:

tambahkan ini ke 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 );

Ia bekerja ketika jquery-migratedipanggil dengan kait standar (yang keluaran <link rel=stylesheet....>) dan tidak dengan load-scripts.phpdalam jumlah besar (seperti di admin-dashboard).

T.Todua
sumber
1

Memiliki masalah yang sama, dan menemukan Anda hanya perlu set SCRIPT_DEBUGke falsedalam Anda wp-config.php. Semoga ini bisa membantu seseorang

Yuri
sumber
2
Itu tidak berhasil untuk saya.
Serj Sagan
-1

Seperti yang disebutkan sebelumnya oleh Andy WordPress menggunakan skrip migrasi jQuery untuk memastikan kompatibilitas ke belakang dan inilah mengapa ini secara otomatis dimuat secara default.

Berikut adalah cara yang aman untuk menghapus modul JQuery Migrate dan dengan demikian menyingkirkan pemberitahuan JQMIGRATE yang mengganggu sambil mempercepat pemuatan halaman Anda di sisi klien. Cukup salin / tempel kode ini di file functions.php Anda dan Anda selesai:

<?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 );


Keterangan lebih lanjut

Untuk mendapatkan detail lebih lanjut tentang alasan saya menggunakan fungsi statis, baca artikel saya di sini:
►► https://en.guydumais.digital/disable-jquery-migrate-in-wordpress/

Guy Dumais Digital
sumber
2
downvoted karena 1. ini berbau terlalu banyak spam dan hanya melakukan upaya minimal untuk merasa seperti jawaban. 2. Anda kode keras versi nullifying cache busting.
Mark Kaplun
ini memalukan karena ini pendekatan yang bagus, bahkan jika Anda menggunakan add_filteritu sebenarnya sebuah tindakan.
pcarvalho