Fastidioso "JQMIGRATE: Migrate is ..." nella console dopo l'aggiornamento a WordPress 4.5


53

Perché c'è un avviso costante,

JQMIGRATE: Migrate è installato, versione 1.4.0

che indica load-scripts.phpnella 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 vedo davvero che senso abbia. Devo aggiornare qualcosa o apportare alcune modifiche al mio codice?

Forse ho un po 'di disturbo ossessivo compulsivo, ma di solito quando ispeziono il sito, mi piace vedere errori e avvisi reali che indicano un problema nella mia console ...


+1 al tuo OCD molto utile. Questo probabilmente deriva dallo script di migrazione jquery / compatibilità con le versioni precedenti. Qualche possibilità che usi una versione non modificata / dev?
Mark Kaplun,

Versione non migrata di migrare? Per quanto ne sappia no, potrebbe trattarsi di alcuni plugin, ma al momento dell'ispezione non ne vedo nulla: \
dingo_d

1
nota che entrambe le versioni sono in /wp-admin/js/jquery/jquery-migrate.js/wp-admin/js/jquery/jquery-migrate.min.js
dir

Risposte:


50

WordPress utilizza lo script di migrazione jQuery per garantire la retrocompatibilità per eventuali plug-in o temi che potresti utilizzare che utilizzano funzionalità rimosse dalle versioni più recenti di jQuery.

Con il rilascio di WordPress 4.5, sembra che abbiano aggiornato la versione di jQuery migrare da v1.2.1 a v1.4.0 - Avere una scansione rapida attraverso il codice rivela che v1.4.0 registra che lo script viene caricato indipendentemente dal fatto che migrateMutel'opzione è impostata e in entrambe le versioni non compressa e ridotta.

L'unico modo per rimuovere l'avviso è assicurarsi che tutti i plug-in / il codice tema non si basino su alcuna vecchia funzionalità jQuery, quindi rimuovere lo script di migrazione. C'è un plugin là fuori per farlo, ma è un metodo abbastanza semplice che può essere semplicemente inserito nel file delle funzioni del tuo tema o simile:

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 noti che questa non è considerata la migliore pratica per lo sviluppo di WordPress e, a mio avviso, lo script di migrazione non dovrebbe essere rimosso solo per motivi di pulizia della console degli sviluppatori.


Quindi sostanzialmente uno dei miei plugin dipende da una funzionalità che faceva parte della vecchia versione di jQuery? C'è un modo per scoprire cos'è quella funzionalità? O sono sicuro di disattivare solo lo script di migrazione?
dingo_d

1
Non posso dire con certezza se alcuni dei tuoi plugin dipendono da vecchie funzionalità, WordPress include solo lo script di migrazione come predefinito sicuro nel caso in cui l'installazione abbia dei plug-in che non sono stati aggiornati da un po 'di tempo. Se fossi in me rimuoverei lo script di migrazione su un'installazione locale del sito e quindi controllerei che tutto funzioni ancora come previsto, assicurandomi che non ci siano errori nella console, ecc.
Andy,

Mi sconsiglio. Questa retrocompatibilità esiste per un motivo. È l'equivalente di jQuery dell'eliminazione del file di funzioni obsolete in WordPress. Il problema di verificare se la configurazione corrente è completamente compatibile non tiene conto nemmeno delle modifiche apportate alla configurazione o alle aggiunte di plug-in e, dati i potenziali problemi che si potrebbero creare, non si compensa con il beneficio completamente dubbio della rimozione di un messaggio di registro della console .
Majick,

1
@majick È oltre lo scopo di questa risposta discutere se la rimozione dello script sia una buona idea o meno, questo risolve specificamente il problema di come rimuovere il messaggio nella console. FWIW, penso che anche rimuovere la sceneggiatura sia una cattiva idea. Penso che il downvote non sia richiesto, poiché la mia risposta risponde perfettamente alla domanda dei PO.
Andy,

1
scusate non faccio il downvote spesso, ma ho sentito che era necessario qui in quanto non vi è alcun avvertimento che questa potrebbe non essere una buona idea ed è l'opposto della migliore pratica in sviluppo (aggiungere un avvertimento e rimuoverò il downvote). credo che la domanda sia come rimuovere solo il messaggio della console e non come rimuovere jquery migrare da solo. se qualcuno chiedesse come rimuovere il messaggio nag di aggiornamento in WordPress non risponderebbe "disinstallare WordPress".
Majick,

11

È possibile modificare il testo del messaggio di registro in vuoto jquery-migrate.min.jsma questo non verrà conservato nell'aggiornamento principale.

L'alternativa è quella di aggiungere la copia della funzione passthrough / filter console.logappena prima del caricamento dello script di migrazione e di dirgli di ignorare i messaggi di log che contengono " Migrate is installed". Farlo in questo modo preserverà anche altri avvisi di migrazione:

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

Il risultato è una riga di script HTML aggiunta a frontend e backend che ottiene l'effetto desiderato (impedisce il messaggio installato).


1
+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 migratore;)
Mark Kaplun

sì, ma non sono affatto d'accordo con la rimozione del migratore come pratica perché non tiene conto dell'installazione di temi / plugin che potrebbero non essere ancora compatibili con l'ultimo jQuery. come parrallel ci sono molti plugin che funzionano ancora bene anche se potrebbero non aver realizzato una funzione WordPress qui o c'è "ufficialmente" deprecato. la retrocompatibilità è prevenzione e meglio di una cura quando si tratta di entrambi i casi e, bene, del software in generale.
Majick,

2
Hai ragione, ma non supportare l'ultima versione di jquery è un bug IMO. 4.5 è entrato in RC circa un mese fa e se il codice non è stato testato per funzionare con tutte le modifiche introdotte, il tema / plugin non è veramente compatibile. Al di fuori del mondo, i messaggi di deprecazione di wordpress si trasformano in deprecazioni effettive a un certo punto e non si desidera lasciare la gestione al momento in cui è necessario aggiornare al più presto. Il migratore IMO dovrebbe essere una soluzione temporanea, non una funzione permanente.
Mark Kaplun,

2
Non sono d'accordo sui presidi qui, Internet è un obiettivo in rapido movimento e il panorama cambia continuamente. (ad esempio, quando è stato necessario portare la funzione logo del sito su 4.5, i siti sono passati dall'idea di avere un solo logo). Il vecchio è buono solo se applicato a nicchie molto specifiche e stabili, ma ad esempio jQuery è noto per essere un bersaglio relativamente mobile.
Mark Kaplun,

1
Un tema non è un prodotto isolato. Se un tema fosse confezionato in wordpress, jquery ecc., Allora l'età del tema sarebbe stata totalmente pertinente. Poiché nessun tema lo fa, se il tema non è stato testato rispetto alla versione di wordpress in uso, non è abbastanza chiaro quale tipo di bug verrà scoperto. Questa è solo un'altra manifestazione del dilemma del collegamento statico vs dinamico. In un mondo di collegamenti statici la tua richiesta è per lo più vera, ma wordpress è un collegamento dinamico e solo perché qualcosa ha funzionato con 3.5 non significa che funzionerà con 4.5 anche con il tentativo di essere retrocompatibile
Mark Kaplun

7

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;

così ho provato quanto segue con il nuovo wp_add_inline_script(), introdotto nella versione 4.5:

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

Questo cambierà:

JQMIGRATE: Migrate è installato con registrazione attiva, versione 1.4.0

per:

JQMIGRATE: Migrate è installato, versione 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 );
}

1
Quindi il codice in basso rimuove solo il messaggio, giusto? Voglio dire, la migrazione rimane ma il messaggio è soppresso, giusto? È meglio che rimuovere definitivamente la migrazione
dingo_d

1
no, questa è una copia del codice che produce il messaggio di registro della console che genera l' output. mostra che migrateMute viene testato solo per la seconda metà del messaggio della console - la prima metà viene emessa indipendentemente ... la rimozione di questo blocco di codice rimuoverà il messaggio della console, ma sarà necessario ripetere ogni aggiornamento di WP.
Majick,

2
Grazie per la ricerca e i dettagli! IMO è l'opzione migliore, poiché la rimozione di JQmigrate non è sempre una buona idea, poiché molti plug-in WP dipendono da funzioni jQuery obsolete. Questa soluzione aiuta a ripulire un po 'l'output della console!
Philipp,

1

Soluzione:

aggiungi questo a 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-migrateviene chiamato con hook standard (quali output <link rel=stylesheet....>) e non load-scripts.phpin blocco (come nel pannello di amministrazione).


1

Avuto lo stesso problema, e scoperto non vi resta che insieme SCRIPT_DEBUGa falsenel vostro wp-config.php. Spero che questo aiuti qualcuno


2
Non ha funzionato per me.
Serj Sagan,

-1

Come accennato in precedenza da Andy WordPress utilizza lo script migrate jQuery per garantire la retrocompatibilità ed è per questo che viene caricato automaticamente per impostazione predefinita.

Ecco un modo sicuro per rimuovere il modulo JQuery Migrate e quindi sbarazzarci del fastidioso avviso JQMIGRATE mentre acceleri il caricamento della tua pagina sul lato client. Semplicemente copia / incolla questo codice nel tuo functions.php del file e il gioco è fatto:

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


Più dettagli

Per maggiori dettagli sul motivo per cui sto usando una funzione statica, leggi il mio articolo qui:
►► https://en.guydumais.digital/disable-jquery-migrate-in-wordpress/


2
downvoted perché 1. questo puzza troppo di spam e fa solo il minimo sforzo per sentirsi come una risposta. 2. Hai codificato la versione annullando il busting della cache.
Mark Kaplun,

è un peccato perché è un buon approccio, anche se stai usando add_filterquando è in realtà un'azione.
pcarvalho,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.