Mesajul enervant "JQMIGRATE: Migrate is..." în consolă după actualizarea la WordPress 4.5
De ce apare o notificare constantă,
JQMIGRATE: Migrate is installed, version 1.4.0
care indică spre load-scripts.php
în consola mea când mi-am actualizat tema la WordPress 4.5, și cum poate fi eliminată?
Nu este o eroare, dar este mereu prezentă în consola mea, și chiar nu înțeleg care este scopul ei. Ar trebui să actualizez ceva sau să fac modificări în codul meu?
Poate am puțin TOC (tulburare obsesiv-compulsivă), dar de obicei când inspectez site-ul, îmi place să văd erori și notificări reale care indică o problemă în consola mea...
EDITARE
WordPress 5.5 a eliminat scriptul jQuery Migrate, ca un pas pregătitor pentru actualizarea jQuery la cea mai recentă versiune în 5.6. Astfel că notificarea ar trebui să dispară.
https://make.wordpress.org/core/2020/06/29/updating-jquery-version-shipped-with-wordpress/

WordPress folosește scriptul jQuery migrate pentru a asigura compatibilitatea cu versiunile anterioare pentru orice plugin-uri sau teme pe care le-ai putea folosi și care utilizează funcționalități eliminate din versiunile mai noi ale jQuery.
Odată cu lansarea WordPress 4.5, se pare că au actualizat versiunea jQuery migrate de la v1.2.1 la v1.4.0 - O scurtă analiză a codului arată că v1.4.0 înregistrează în consolă faptul că scriptul este încărcat, indiferent dacă opțiunea migrateMute
este setată sau nu, atât în versiunile necomprimate cât și în cele minificate.
Singura modalitate de a elimina această notificare este să te asiguri că toate plugin-urile și codul temei tale nu depind de funcționalități vechi jQuery și apoi să elimini scriptul migrate. Există un plugin care face acest lucru, dar este o metodă destul de simplă care poate fi plasată în fișierul functions.php al temei sau într-un loc similar:
add_action('wp_default_scripts', function ($scripts) {
if (!empty($scripts->registered['jquery'])) {
$scripts->registered['jquery']->deps = array_diff($scripts->registered['jquery']->deps, ['jquery-migrate']);
}
});
Te rog să reții că această abordare nu este considerată o practică recomandată în dezvoltarea WordPress și, în opinia mea, scriptul migrate nu ar trebui eliminat doar pentru a păstra consola dezvoltatorului curată.

Deci, practic, unul dintre plugin-urile mele depinde de o funcționalitate care făcea parte din vechea versiune jQuery? Există vreo modalitate de a afla care este acea funcționalitate? Sau pot să dezactivez în siguranță scriptul migrate?

Nu pot spune cu siguranță dacă vreunul dintre plugin-urile tale depinde de funcționalități vechi, WordPress include scriptul migrate ca măsură de siguranță implicită în cazul în care instalarea ta are plugin-uri care nu au fost actualizate de ceva timp. Dacă aș fi în locul tău, aș elimina scriptul migrate pe o instalare locală a site-ului și apoi aș verifica dacă totul funcționează în continuare conform așteptărilor, asigurându-mă că nu există erori în consolă etc.

Nu recomand acest lucru. Această compatibilitate cu versiunile anterioare există dintr-un motiv. Este echivalentul jQuery al ștergerii fișierului cu funcții depreciate din WordPress. A te strădui să verifici dacă configurația ta actuală este complet compatibilă nici măcar nu ia în considerare modificările de configurare sau adăugările de plugin-uri, și având în vedere problemele potențiale pe care le-ai crea, nu se justifică în raport cu beneficiul complet îndoielnic de a elimina un mesaj din consola de log.

@majick Este dincolo de scopul acestui răspuns să discutăm dacă eliminarea scriptului este o idee bună sau nu, acest răspuns abordează specific problema modului de eliminare a mesajului din consolă. Din experiența mea, cred că eliminarea scriptului este o idee proastă. Consider că votul negativ este nejustificat, deoarece răspunsul meu răspunde perfect la întrebarea OP-ului.

Îmi pare rău, nu dau vote negative des, dar am simțit că este necesar aici deoarece nu există nicio avertizare că acest lucru ar putea să nu fie o idee bună și este opusul celor mai bune practici în dezvoltare (adaugă o avertizare și voi elimina votul negativ.) Cred că întrebarea se referă la cum să elimini doar mesajul din consolă, nu cum să elimini jquery migrate în sine. Dacă cineva ar întreba cum să elimine mesajul de actualizare din WordPress nu ai răspunde "dezinstalează WordPress."

@majick avertizare adăugată. Ai dreptate că întrebarea se referă la cum să elimini mesajul din consolă, răspunsul meu specifică faptul că singura modalitate de a elimina mesajul este să elimini scriptul, ceea ce este adevărat dacă nu mergi pe calea rescrierii funcțiilor native ale browserului ca în răspunsul tău.

nicio problemă, downvote eliminat. pentru mine personal, dacă chiar m-ar deranja, aș prefera să comentez mesajul în fișierul migrate js la fiecare actualizare WP decât să-l elimin complet oricum. pentru că JavaScript este destul de temperamental, uneori un singur lucru deplasat și aproape totul se strică.. este un risc prea mare fără niciun beneficiu când acest lucru este pus specific pentru a evita asta.

Acest mesaj de eroare este enervant dar eliminarea lui la fiecare site nou este o pierdere de timp. Ar fi grozav dacă undeva am putea cere amabil unui dezvoltator care a pus mesajul în WordPress să-l elimine în următoarea versiune :)

@IvanTopić Nu a fost adăugat de niciun dezvoltator WordPress, a fost adăugat de echipa jQuery. Din câte se pare nu este ceva ce vor elimina: https://github.com/jquery/jquery-migrate/issues/149

Ai putea schimba textul mesajului de log să fie gol în jquery-migrate.min.js
dar această modificare nu va fi păstrată la actualizarea core-ului.
Alternativa este să adaugi o funcție de trecere/filtrare care să copieze console.log
chiar înainte ca scriptul migrate să fie încărcat și să îi spui să ignore mesajele de logging care conțin 'Migrate is installed
'. Procedând în acest fel se vor păstra și celelalte avertismente Migrate:
// script pentru eliminarea mesajelor
function jquery_migrate_silencer() {
// creează o copie a funcției
$silencer = '<script>window.console.logger = window.console.log; ';
// modifică funcția originală pentru a filtra și a folosi copia funcției
$silencer .= 'window.console.log = function(tolog) {';
// ieși dacă e gol pentru a preveni eroarea
$silencer .= 'if (tolog == null) {return;} ';
// filtrează mesajele care conțin șirul specificat
$silencer .= 'if (tolog.indexOf("Migrate is installed") == -1) {';
$silencer .= 'console.logger(tolog);} ';
$silencer .= '}</script>';
return $silencer;
}
// pentru frontend, folosește filtrul script_loader_tag
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();
// adaugă la începutul încărcării jquery migrate
$tag = $silencer.$tag;
}
return $tag;
}
// pentru admin, conectează la admin_print_scripts
add_action('admin_print_scripts','jquery_migrate_echo_silencer');
function jquery_migrate_echo_silencer() {echo jquery_migrate_silencer();}
Rezultatul este o linie de script HTML adăugată atât în frontend cât și în backend care realizează efectul dorit (previne afișarea mesajului de instalare.)

+1 pentru idee, dar dacă este site-ul tău, probabil este mai bine să te asiguri că toate scripturile tale sunt compatibile cu ultima versiune și să elimini migratorul ;)

da, dar nu sunt deloc de acord cu eliminarea migratorului ca practică deoarece nu ia în considerare instalarea temelor/plugin-urilor care s-ar putea să nu fie încă compatibile cu cel mai recent jQuery. Ca paralelă, există multe plugin-uri care încă funcționează bine chiar dacă poate nu au realizat că o funcție WordPress de aici sau de acolo este "oficial" depreciată. Compatibilitatea cu versiunile anterioare este prevenție și este mai bună decât un remediu când vine vorba de ambele cazuri și, ei bine, de software în general.

Ai dreptate, dar nesusținerea celei mai recente versiuni jQuery este un bug în opinia mea. 4.5 a intrat în RC acum aproximativ o lună, și dacă codul nu a fost testat să funcționeze cu toate schimbările pe care le-a introdus, atunci tema/plugin-ul nu sunt cu adevărat compatibile. În lumea din afara WordPress mesajele de depreciere se transformă la un moment dat în deprecieri efective, și nu vrei să lași gestionarea lor pentru momentul în care trebuie să faci upgrade urgent. Migratorul, în opinia mea, ar trebui să fie o soluție temporară, nu o funcționalitate permanentă.

Sunt de acord că este o soluție temporară, dar tocmai din acest motiv, acum este de fapt momentul când este cel mai important! Sigur, procesul de depreciere din WordPress ar putea fi optimizat, dar având în vedere dimensiunea mică a fișierului deprecated.php
, păstrarea alias-urilor vechi ale funcțiilor care fac referire la cele noi are un impact minor asupra performanței și împiedică lucrurile să se strice. Prefer oricând un plugin bine codat dar "vechi" în locul unuia "nou" dar prost codat. Ideologia "noul este mai bun" nu ar trebui să strice software-ul care funcționează bine doar pentru că "am schimbat numele acelei funcții" etc.

Nu sunt de acord cu principiile aici, internetul este o țintă în continuă mișcare iar peisajul se schimbă tot timpul. (până când funcționalitatea logo-ului site-ului a ajuns la versiunea 4.5 de exemplu, site-urile evoluaseră deja de la ideea de a avea un singur logo). Vechiul este bun doar când este aplicat unor nișe foarte specifice și stabile, dar jQuery de exemplu este cunoscut ca fiind o țintă în relativă mișcare.

Pot să fiu de acord că nu suntem de acord. Doar pentru că există progres și caracteristici noi nu este un motiv să abandonăm lucrurile vechi care funcționează, fie că este vorba despre jQuery, WordPress sau o temă sau un plugin sau orice altceva... Testul pentru orice cod ar trebui să fie "funcționează" sau "cât de bun este" nu "cât de vechi este"... și folosirea criteriului "cât de vechi este" ca unitate de măsură pentru software-ul funcțional duce direct la stricarea lui inutil în acest fel... când codul nou este cel mai predispus la erori! În mod realist, să te aștepți ca dezvoltatorii să țină pasul cu actualizările pentru ceva ce ar funcționa perfect altfel este prea mult - distruge afaceri întregi.

O temă nu este un produs izolat. Dacă o temă ar fi ambalat WordPress și jQuery etc, atunci vechimea temei ar fi fost total relevantă. Cum nicio temă nu face acest lucru, dacă tema nu a fost testată cu versiunea de WordPress care este folosită, atunci nu este suficient de clar ce fel de erori vor fi descoperite. Aceasta este doar o altă manifestare a dilemei între legarea statică și dinamică. Într-o lume cu legare statică afirmația ta este în mare parte adevărată, dar WordPress folosește legare dinamică și doar pentru că ceva a funcționat cu 3.5 nu înseamnă că va funcționa cu 4.5 chiar și cu încercarea de a păstra compatibilitatea inversă

Doar un mic test aici.
M-am uitat în jquery-migrate.js și am observat această parte:
// Setează ca true pentru a preveni output-ul în consolă; migrateWarnings încă se păstrează
// jQuery.migrateMute = false;
așa că am testat următorul cod folosind noua funcție wp_add_inline_script()
, introdusă în versiunea 4.5:
add_action( 'wp_enqueue_scripts', function()
{
wp_add_inline_script(
'jquery-migrate', 'jQuery.migrateMute = true;',
'before'
);
} );
Aceasta va schimba:
JQMIGRATE: Migrate este instalat cu logging activ, versiunea 1.4.0
în:
JQMIGRATE: Migrate este instalat, versiunea 1.4.0
Deci nu previne de fapt tot output-ul consolei, cum este această parte din jquery-migrate.js
:
// Afișează un mesaj în consolă pentru a știi dezvoltatorii că suntem activi
if ( window.console && window.console.log ) {
window.console.log( "JQMIGRATE: Migrate este instalat" +
( jQuery.migrateMute ? "" : " cu logging activ" ) +
", versiunea " + jQuery.migrateVersion );
}

Deci codul de jos doar elimină mesajul, nu? Adică, migrate rămâne dar mesajul este suprimat, corect? Asta e mai bine decât să eliminăm definitiv migrate

nu, acesta este o copie a codului care produce mesajul din consolă ce chiar generează output. arată că migrateMute este testat doar pentru a doua jumătate a mesajului din consolă - prima jumătate este afișată oricum... eliminarea acestui bloc de cod va elimina mesajul din consolă, dar ar trebui să refaci asta la fiecare actualizare WP.

Mulțumesc pentru cercetare și detalii! După părerea mea aceasta este cea mai bună opțiune, deoarece eliminarea JQmigrate nu este întotdeauna o idee bună, pentru că multe plugin-uri WP depind de funcții jQuery depreciate. Această soluție ajută la curățarea unui pic a output-ului din consolă!

Dacă dorești să le elimini și în admin, poți da funcției anonime un nume și să o apelezi atât pe wp_enqueue_scripts
cât și pe admin_enqueue_scripts
.

Soluție:
adaugă acest cod în fișierul 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 );
Funcționează atunci când jquery-migrate
este apelat cu hook-ul standard (care generează <link rel=stylesheet....>
) și nu cu load-scripts.php
în mod grupat (cum ar fi în panoul de administrare).

Modifică Consola Inspector doar când este necesar
În loc să codezi fix în site-ul tău, majoritatea inspectorilor îți oferă metode pentru a edita local rezultatele consolei.
Pentru Chrome și Opera
Folosind consola inspector poți da click dreapta pe avertismentul JQMIGRATE ...
și click pe 'Ascunde mesajele din jquery-migrate.js'.
Filtru Consolă
Aceasta va adăuga '-url:<URL-UL_TAU_WORDPRESS>/wp-includes/js/jquery/jquery-migrate.js?ver=3.3.2'
la filtrul consolei. Efectiv va elimina acest url din rezultatele consolei.
Notă: dacă copiezi textul de mai sus în filtre, înlocuiește <URL-UL_TAU_WORDPRESS>
cu url-ul tău wp
Acest filtru de consolă este aplicat persistent și pentru filele și ferestrele noi.
Safari
Pentru Safari poți crea destul de ușor un Override Local pentru Răspuns în inspector.
Dă click dreapta pe jquery-migrate.js:line
din partea dreaptă a rezultatelor consolei, apoi selectează 'Create Response Local Override'.
Aceasta înseamnă că editezi fișierul local în scopuri de dezvoltare. Așadar, pentru a elimina aceste notificări migrate, adaugă acest cod în partea de sus a fișierului jquery-migrate.js
în Override-ul Local pentru Răspuns.
/**
* Override Local pentru Răspuns
*/
jQuery.migrateMute = true;
Firefox
Override-urile locale nu sunt suportate momentan. https://support.mozilla.org/en-US/questions/1331771
Filtru pentru Consolă bazat pe File/Ferestre
Scrie -jquery-migrate.js
în bara 'Filter Output' și notificările jQuery migrate vor dispărea chiar și la reîncărcarea filei.
Atenție: acest filtru de consolă va trebui aplicat de fiecare dată când deschizi o filă sau fereastră nouă în Firefox.
Sper că ajută!

2023
Acest comentariu de aici:
Iată ceva care dezactivează toate console.trace-urile:
<?php
function _jqmigrate_mute() {
wp_add_inline_script('jquery-migrate', 'jQuery.migrateMute = true;', 'before');
}
add_action('wp_enqueue_scripts', '_jqmigrate_mute');
add_action('admin_enqueue_scripts', '_jqmigrate_mute');
Nu oprește anunțul inițial, dar economisește o mulțime de spațiu în rest.
