Fastidioso "JQMIGRATE: Migrate is..." nella console dopo l'aggiornamento a WordPress 4.5
Perché c'è un avviso costante,
JQMIGRATE: Migrate is installed, version 1.4.0
che punta a load-scripts.php
nella mia console quando ho aggiornato il mio tema a WordPress 4.5, e come può essere rimosso?
Non è un errore, ma è sempre presente nella mia console e non capisco davvero quale sia il suo scopo. Dovrei aggiornare qualcosa o apportare modifiche al mio codice?
Forse ho un po' di DOC (Disturbo Ossessivo-Compulsivo), ma di solito quando ispeziono il sito, mi piace vedere errori e avvisi reali che indicano un problema nella mia console...
MODIFICA
WordPress 5.5 ha rimosso lo script jQuery Migrate, come passo preparatorio per l'aggiornamento di jQuery all'ultima versione in 5.6. Quindi l'avviso dovrebbe essere scomparso.
https://make.wordpress.org/core/2020/06/29/updating-jquery-version-shipped-with-wordpress/
WordPress utilizza lo script jQuery migrate per garantire la retrocompatibilità per qualsiasi plugin o tema che potresti utilizzare che usa funzionalità rimosse dalle versioni più recenti di jQuery.
Con il rilascio di WordPress 4.5, sembra che abbiano aggiornato la versione di jQuery migrate da v1.2.1 a v1.4.0 - Dando una rapida occhiata al codice, si scopre che la v1.4.0 registra che lo script viene caricato indipendentemente dal fatto che l'opzione migrateMute
sia impostata o meno, sia nelle versioni non compresse che in quelle minificate.
L'unico modo per rimuovere l'avviso è assicurarsi che tutti i plugin e il codice del tema non dipendano da vecchie funzionalità jQuery, e poi rimuovere lo script migrate. Esiste un plugin per fare questo, ma è un metodo abbastanza semplice che può essere inserito nel file functions del tuo tema o simili:
add_action('wp_default_scripts', function ($scripts) {
if (!empty($scripts->registered['jquery'])) {
$scripts->registered['jquery']->deps = array_diff($scripts->registered['jquery']->deps, ['jquery-migrate']);
}
});
Si prega di notare che questa non è considerata una best practice per lo sviluppo WordPress e secondo la mia opinione lo script migrate non dovrebbe essere rimosso solo per mantenere pulita la console dello sviluppatore.

Quindi fondamentalmente uno dei miei plugin dipende da una funzionalità che faceva parte della vecchia versione di jQuery? C'è un modo per scoprire quale sia questa funzionalità? O posso tranquillamente disattivare lo script migrate?

Non posso dire con certezza se qualcuno dei tuoi plugin dipenda da vecchie funzionalità, WordPress include semplicemente lo script migrate come impostazione predefinita di sicurezza nel caso in cui la tua installazione abbia plugin che non sono stati aggiornati da un po'. Se fossi in te rimuoverei lo script migrate su un'installazione locale del sito e poi verificherei che tutto funzioni ancora come previsto, assicurandomi che non ci siano errori nella console ecc.

Sconsiglio di farlo. Questa retrocompatibilità esiste per un motivo. È l'equivalente jQuery dell'eliminazione del file delle funzioni deprecate in WordPress. Prendersi la briga di verificare se la tua configurazione attuale sia completamente compatibile non tiene nemmeno conto dei cambiamenti di configurazione o delle aggiunte di plugin, e considerando i potenziali problemi che si andrebbero a creare, non bilancia il beneficio del tutto dubbio di rimuovere un messaggio della console.

@majick Va oltre lo scopo di questa risposta discutere se rimuovere lo script sia una buona idea o meno, questo affronta specificamente la questione di come rimuovere il messaggio nella console. Per quello che vale, penso che rimuovere lo script sia anche una cattiva idea. Ritengo che il voto negativo sia ingiustificato, poiché la mia risposta risponde perfettamente alla domanda dell'OP.

Mi dispiace, non do spesso voti negativi, ma ho sentito che era necessario qui poiché non c'è alcun avviso che questo potrebbe non essere una buona idea ed è l'opposto delle migliori pratiche nello sviluppo (aggiungi un avviso e rimuoverò il voto negativo). Credo che la domanda chieda come rimuovere solo il messaggio della console, non come rimuovere jquery migrate stesso. Se qualcuno chiedesse come rimuovere il messaggio di aggiornamento in WordPress non risponderesti "disinstalla WordPress".

@majick avviso aggiunto. Hai ragione nel dire che la domanda chiede come rimuovere il messaggio della console, la mia risposta afferma che l'unico modo per rimuovere il messaggio è rimuovere lo script, il che è vero a meno che non si segua la strada della riscrittura delle funzioni native del browser come nella tua risposta.

nessun problema, downvote rimosso. per quanto mi riguarda, se mi desse davvero fastidio, preferirei commentare il messaggio nel file migrate js ad ogni aggiornamento di WP piuttosto che rimuoverlo completamente. questo perché JavaScript è piuttosto imprevedibile, a volte basta una cosa fuori posto e quasi tutto si rompe... è un rischio troppo grande senza alcun vantaggio quando questo è specificamente presente per evitare ciò.

Questo messaggio di errore è fastidioso ma rimuoverlo su ogni nuovo sito è una perdita di tempo. Sarebbe fantastico se da qualche parte potessimo gentilmente chiedere a uno sviluppatore che ha inserito il messaggio in WordPress di rimuoverlo nel prossimo rilascio :)

@IvanTopić Non è stato aggiunto da nessuno sviluppatore WordPress, è stato aggiunto dal team di jQuery. A quanto pare non è qualcosa che rimuoveranno: https://github.com/jquery/jquery-migrate/issues/149

Potresti modificare il testo del messaggio di log in jquery-migrate.min.js
impostandolo vuoto, ma questa modifica non verrà mantenuta dopo l'aggiornamento del core.
L'alternativa è aggiungere una funzione di passthrough/filtro che copia console.log
appena prima che lo script migrate venga caricato, e dirgli di ignorare i messaggi di log che contengono 'Migrate is installed
'. In questo modo verranno preservati anche gli altri avvisi di Migrate:
// script silenziatore
function jquery_migrate_silencer() {
// crea una copia della funzione
$silencer = '<script>window.console.logger = window.console.log; ';
// modifica la funzione originale per filtrare e utilizzare la copia della funzione
$silencer .= 'window.console.log = function(tolog) {';
// esce se vuoto per prevenire errori
$silencer .= 'if (tolog == null) {return;} ';
// filtra i messaggi contenenti la stringa
$silencer .= 'if (tolog.indexOf("Migrate is installed") == -1) {';
$silencer .= 'console.logger(tolog);} ';
$silencer .= '}</script>';
return $silencer;
}
// per il frontend, usa il filtro 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();
// aggiunge all'inizio del caricamento di jquery migrate
$tag = $silencer.$tag;
}
return $tag;
}
// per l'admin, aggancia a admin_print_scripts
add_action('admin_print_scripts','jquery_migrate_echo_silencer');
function jquery_migrate_echo_silencer() {echo jquery_migrate_silencer();}
Il risultato è una singola riga di script HTML aggiunta sia al frontend che al backend che ottiene l'effetto desiderato (impedisce la visualizzazione del messaggio di installazione.)

+1 per l'idea, ma se è il tuo sito, è probabilmente meglio assicurarsi che tutti i tuoi script siano compatibili con l'ultima versione e rimuovere il migrator ;)

sì ma non sono d'accordo con la rimozione del migrator come pratica in generale perché non tiene conto dell'installazione di temi/plugin che potrebbero non essere ancora compatibili con l'ultima versione di jQuery. Come parallelo ci sono molti plugin che funzionano ancora bene anche se alcune funzioni WordPress qui e là sono "ufficialmente" deprecate. La compatibilità all'indietro è prevenzione ed è meglio di una cura quando si tratta di entrambi i casi e, beh, del software in generale.

Hai ragione, ma non supportare l'ultima versione di jQuery è un bug secondo me. La 4.5 è entrata in RC circa un mese fa, e se il codice non è stato testato per funzionare con tutti i cambiamenti che ha introdotto, allora il tema/plugin non sono veramente compatibili. Nel mondo al di fuori di WordPress i messaggi di deprecazione si trasformano in deprecazione effettiva ad un certo punto, e non vuoi lasciare la gestione al momento in cui devi aggiornare il prima possibile. Il migrator secondo me dovrebbe essere una soluzione temporanea, non una caratteristica permanente.

Sono d'accordo che sia una soluzione temporanea, ma proprio per questo, ora è il momento in cui è più importante! Certo il processo di deprecazione all'interno di WordPress potrebbe essere ottimizzato ma con le piccole dimensioni di deprecated.php
ha davvero un impatto minimo sulle prestazioni mantenere i vecchi alias delle funzioni che si riferiscono a quelli nuovi ed evita che le cose si rompano. Preferisco un plugin ben programmato ma "vecchio" rispetto a uno "nuovo" ma mal programmato. L'ideologia del "nuovo è migliore" non dovrebbe rompere software altrimenti ben funzionante solo perché "oh abbiamo cambiato il nome di quella funzione" ecc.

Non sono d'accordo sui principi, internet è un obiettivo in rapido movimento e il panorama cambia continuamente. (nel tempo che ci è voluto per portare la funzionalità del logo del sito alla versione 4.5 per esempio, i siti si erano già evoluti dall'idea di avere un solo logo). Il vecchio è buono solo quando applicato a nicchie molto specifiche e stabili ma jQuery per esempio è noto per essere un target relativamente mobile.

Posso concordare sul disaccordo. Solo perché c'è progresso e nuove funzionalità non è un motivo per abbandonare vecchie cose che funzionano, che si tratti di jQuery, WordPress o un tema o un plugin o qualsiasi altra cosa... Il test di qualsiasi codice dovrebbe essere "funziona" o "quanto è buono" non "quanto è vecchio"... e usare "quanto è vecchio" come metro di misura per un software funzionante porta direttamente a romperlo inutilmente in questo modo... quando il codice nuovo è quello con più bug! Realisticamente, aspettarsi che gli sviluppatori stiano al passo con gli aggiornamenti per qualcosa che altrimenti funzionerebbe perfettamente è semplicemente troppo - uccide intere attività.

Un tema non è un prodotto isolato. Se un tema includesse WordPress e jQuery ecc., allora l'età del tema sarebbe stata totalmente rilevante. Poiché nessun tema fa questo, se il tema non è stato testato con la versione di WordPress in uso, non è abbastanza chiaro che tipo di bug potrebbero essere scoperti. Questo è solo un'altra manifestazione del dilemma del collegamento statico vs dinamico. In un mondo di collegamenti statici la tua affermazione è per lo più vera, ma WordPress utilizza collegamenti dinamici e solo perché qualcosa ha funzionato con la versione 3.5 non significa che funzionerà con la 4.5 anche con il tentativo di mantenere la retrocompatibilità

Solo un piccolo test qui.
Ho dato un'occhiata a jquery-migrate.js e ho notato questa parte:
// Set to true to prevent console output; migrateWarnings still maintained
// jQuery.migrateMute = false;
quindi ho testato quanto segue con la nuova funzione wp_add_inline_script()
, introdotta nella versione 4.5:
add_action( 'wp_enqueue_scripts', function()
{
wp_add_inline_script(
'jquery-migrate', 'jQuery.migrateMute = true;',
'before'
);
} );
Questo cambierà:
JQMIGRATE: Migrate is installed with logging active, version 1.4.0
in:
JQMIGRATE: Migrate is installed, version 1.4.0
Quindi in realtà non impedisce tutto l'output della console, come questa parte in 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 );
}

Quindi il codice in basso rimuove solo il messaggio, giusto? Intendo, il migrate rimane ma il messaggio viene soppresso, giusto? Questo è meglio che rimuovere definitivamente il migrate

no, quello è una copia del codice che produce il messaggio nella console che viene effettivamente mostrato. Mostra che migrateMute viene testato solo per la seconda metà del messaggio della console - la prima metà viene mostrata comunque... rimuovere questo blocco di codice rimuoverà il messaggio della console, ma dovresti rifarlo ad ogni aggiornamento di WP.

Grazie per la ricerca e i dettagli! Secondo me è l'opzione migliore, dato che rimuovere JQmigrate non è sempre una buona idea, perché molti plugin di WP dipendono da funzioni jQuery deprecate. Questa soluzione aiuta a ripulire un po' l'output della console!

Se vuoi rimuoverli anche nell'area amministrativa, puoi dare un nome alla funzione anonima e chiamarla sia su wp_enqueue_scripts
che su admin_enqueue_scripts
.

Soluzione:
aggiungi questo al file 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 );
Funziona quando jquery-migrate
viene richiamato con l'hook standard (che produce <link rel=stylesheet....>
) e non con load-scripts.php
in blocco (come nella dashboard di amministrazione).

Modifica la Console dell'Inspector quando necessario
Invece di inserire codice direttamente nel tuo sito web, la maggior parte degli inspector ti fornisce metodi per modificare localmente l'output della console.
Per Chrome e Opera
Utilizzando la console dell'inspector puoi fare clic destro sull'avviso JQMIGRATE ...
e cliccare su 'Nascondi messaggi da jquery-migrate.js'.
Filtro Console
Questo aggiungerà '-url:<YOUR_WORDPRESS_URL>/wp-includes/js/jquery/jquery-migrate.js?ver=3.3.2'
al filtro della console. In pratica sottraendo questo URL dall'output della console.
Nota: se stai copiando quanto sopra nei filtri, sostituisci <YOUR_WORDPRESS_URL>
con l'URL del tuo WordPress
Questo filtro della console viene applicato in modo persistente anche alle nuove schede e finestre.
Safari
Per Safari puoi creare facilmente un Override Locale della Risposta dell'inspector.
Fai clic destro su jquery-migrate.js:line
alla destra degli output del log della console, quindi seleziona 'Crea Override Locale della Risposta'.
Questo significa che modifichi il file localmente per scopi di sviluppo. Quindi per rimuovere questi avvisi di migrate aggiungi questo all'inizio del file jquery-migrate.js
nel tuo Override Locale della Risposta.
/**
* Override Locale della Risposta
*/
jQuery.migrateMute = true;
Firefox
Gli override locali non sono attualmente supportati. https://support.mozilla.org/en-US/questions/1331771
Filtro Output Console basato su Scheda/Finestra
Digita -jquery-migrate.js
nella barra 'Filtra Output' e gli avvisi di jQuery migrate spariranno anche al ricaricamento della scheda.
Attenzione: questo filtro della console dovrà essere applicato ogni volta che apri una nuova scheda o finestra di Firefox.
Spero che questo aiuti!

2023
Questo commento da qui:
Ecco qualcosa che disabilita tutti i console.trace:
<?php
// Funzione per silenziare i messaggi di jQuery Migrate
function _jqmigrate_mute() {
wp_add_inline_script('jquery-migrate', 'jQuery.migrateMute = true;', 'before');
}
// Aggiungi la funzione sia nel front-end che nell'admin
add_action('wp_enqueue_scripts', '_jqmigrate_mute');
add_action('admin_enqueue_scripts', '_jqmigrate_mute');
Non silenzia l'annuncio iniziale, ma risparmia un sacco di spazio altrimenti.
