Molesto "JQMIGRATE: Migrate is ..." en la consola después de actualizar a WordPress 4.5

53

¿Por qué hay un aviso constante,

JQMIGRATE: Migrate está instalado, versión 1.4.0

eso apunta load-scripts.phpen mi consola cuando actualicé mi tema a WordPress 4.5, y ¿cómo puedo eliminarlo?

No es un error, pero siempre está presente en mi consola, y realmente no veo cuál es el punto. ¿Debo actualizar algo o hacer algunos cambios en mi código?

Tal vez tengo un poco de TOC, pero generalmente cuando inspecciono el sitio, me gusta ver errores y avisos reales que apuntan a un problema en mi consola ...

dingo_d
fuente
+1 a tu muy útil TOC. Esto probablemente proviene de la secuencia de comandos de migración / compatibilidad con versiones anteriores de jquery. ¿Alguna posibilidad de que uses una versión no minificada / dev?
Mark Kaplun
¿Versión no migrada de migrate? No que yo sepa, podrían ser algunos complementos, pero después de la inspección no veo ninguno de ellos: \
dingo_d
1
tenga en cuenta que ambas versiones están en /wp-admin/js/jquery/jquery-migrate.js/wp-admin/js/jquery/jquery-migrate.min.js
directorios

Respuestas:

50

WordPress utiliza la secuencia de comandos de migración jQuery para garantizar la compatibilidad con versiones anteriores de cualquier complemento o tema que pueda estar utilizando y que utilice la funcionalidad eliminada de las versiones más recientes de jQuery.

Con el lanzamiento de WordPress 4.5, parece que han actualizado la versión de jQuery migrate de v1.2.1 a v1.4.0 - Tener un escaneo rápido a través del código revela que v1.4.0 registra que el script se carga independientemente de si migrateMuteLa opción está configurada y en las versiones sin comprimir y minimizadas.

La única forma de eliminar el aviso es asegurarse de que todos sus complementos / código de tema no dependan de ninguna funcionalidad antigua de jQuery, y luego elimine el script de migración. Hay un complemento para hacer esto, pero es un método bastante simple que solo se puede colocar en el archivo de funciones de su tema o 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']);
    }
});

Tenga en cuenta que esto no se considera la mejor práctica para el desarrollo de WordPress y, en mi opinión, el script de migración no se debe eliminar solo por mantener limpia la consola del desarrollador.

Andy
fuente
Entonces, ¿básicamente uno de mis complementos depende de una funcionalidad que era parte de la versión anterior de jQuery? ¿Hay alguna manera de averiguar cuál es esa funcionalidad? ¿O estoy seguro de silenciar el script de migración?
dingo_d
1
No puedo decir con certeza si alguno de sus complementos depende de la funcionalidad anterior, WordPress solo incluye el script de migración como un valor predeterminado seguro en caso de que su instalación tenga complementos que no se hayan actualizado en un tiempo. Si fuera yo, eliminaría el script de migración en una instalación local del sitio y luego comprobaría que todo sigue funcionando como se esperaba, asegurando que no haya errores en la consola, etc.
Andy
Recomiendo contra esto. Esta compatibilidad con versiones anteriores está ahí por una razón. Es el equivalente de jQuery de eliminar el archivo de funciones obsoletas en WordPress. Tomar todas las molestias de verificar si su configuración actual es totalmente compatible ni siquiera tiene en cuenta los cambios de configuración o las adiciones de complementos, y dados los posibles problemas que estaría creando no se equilibra con el beneficio completamente dudoso de eliminar un mensaje de registro de la consola .
majick
1
@majick Está más allá del alcance de esta respuesta discutir si eliminar el script es una buena idea o no, esto aborda específicamente el problema de cómo eliminar el mensaje en la consola. FWIW, creo que eliminar el script también es una mala idea. Creo que el voto negativo no es necesario, ya que mi respuesta responde perfectamente a la pregunta de los OP.
Andy
1
lo siento, no voto a menudo, pero sentí que era necesario aquí, ya que no hay advertencia de que esto puede no ser una buena idea y es lo opuesto a las mejores prácticas en desarrollo (agregue una advertencia y eliminaré el voto negativo). Creo que la pregunta es cómo eliminar solo el mensaje de la consola, no cómo eliminar jquery migrate. si alguien preguntara cómo eliminar el mensaje de actualización en WordPress, no respondería "solo desinstale WordPress".
majick
11

Puede cambiar el texto del mensaje de registro para dejarlo en blanco, jquery-migrate.min.jspero esto no se conservará en la actualización principal.

La alternativa es agregar una copia de la función passthrough / filter console.logjusto antes de que se cargue el script de migración, y decirle que ignore los mensajes de registro que contienen ' Migrate is installed'. Hacerlo de esta manera también preservará otras advertencias de Migrate:

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

El resultado es una línea de secuencia de comandos HTML agregada tanto al front-end como al back-end que logra el efecto deseado (evita el mensaje instalado).

majick
fuente
1
+1 para la idea, pero si es su sitio, probablemente sea mejor asegurarse de que todos sus scripts sean compatibles con la última versión y eliminar el migrador;)
Mark Kaplun
sí, pero simplemente no estoy de acuerdo con eliminar el migrador como práctica porque no tiene en cuenta la instalación de temas / complementos que pueden no ser compatibles con la última versión de jQuery todavía. Paralelamente, hay muchos complementos que aún funcionan bien aunque no se hayan dado cuenta de una función de WordPress aquí o que esté "oficialmente" en desuso. la compatibilidad con versiones anteriores es prevención y mejor que una cura cuando se trata de ambos casos y, bueno, del software en general.
majick
2
Tienes razón, pero no admitir la última versión de jquery es un error de la OMI. 4.5 entró en RC hace aproximadamente un mes, y si el código no fue probado para funcionar con todos los cambios que introdujo, entonces el tema / complemento no es realmente compatible. En el mundo exterior, los mensajes de desaprobación de WordPress se convierten en desaprobación real en algún momento, y no debe dejar de manejarlos en el momento en que tiene que actualizar lo antes posible. El IMO del migrador debería ser una solución temporal, no una característica permanente.
Mark Kaplun
2
No estoy de acuerdo con los principios aquí, Internet es un objetivo en rápido movimiento y el panorama está cambiando todo el tiempo. (en el momento en que llevó la función del logotipo del sitio a 4.5, por ejemplo, los sitios habían pasado de la idea de tener un solo logotipo). Lo antiguo es bueno solo cuando se aplica a nichos muy específicos y estables, pero jQuery, por ejemplo, es un objetivo relativamente móvil.
Mark Kaplun
1
Un tema no es un producto aislado. Si un tema estuviera empaquetando wordpress y jquery, etc., entonces la edad del tema habría sido totalmente relevante. Como ningún tema lo hace, si el tema no se probó con la versión de wordpress que se está utilizando, entonces no está lo suficientemente claro qué tipo de errores se descubrirán. Esta es solo otra manifestación del dilema de enlace estático vs dinámico. En un mundo de enlaces estáticos, su afirmación es mayormente cierta, pero WordPress es un enlace dinámico y solo porque algo haya funcionado con 3.5 no significa que funcionará con 4.5 incluso con el intento de ser incompatible
Mark Kaplun
7

Solo una pequeña prueba aquí.

Me asomé a jquery-migrate.js y noté esta parte:

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

Así que probé lo siguiente con el nuevo wp_add_inline_script(), presentado en la versión 4.5:

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

Esto cambiará:

JQMIGRATE: Migrate se instala con el registro activo, versión 1.4.0

a:

JQMIGRATE: Migrate está instalado, versión 1.4.0

Por lo tanto, en realidad no impide toda la salida de la consola, como esta parte en 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
fuente
1
Entonces, el código inferior simplemente elimina el mensaje, ¿verdad? Quiero decir, la migración se queda pero el mensaje se suprime, ¿verdad? Esto es mejor que eliminar definitivamente la migración
dingo_d
1
no, esa es una copia del código que produce el mensaje de registro de la consola que genera salida. muestra que migrateMute solo se prueba para la segunda mitad del mensaje de la consola: la primera mitad se emite independientemente ... al eliminar este bloque de código se eliminará el mensaje de la consola, pero necesitaría rehacer cada actualización de WP.
majick
2
Gracias por la investigación y detalles! IMO es la mejor opción, ya que eliminar JQmigrate no siempre es una buena idea, ya que muchos complementos de WP dependen de funciones jQuery obsoletas. ¡Esta solución ayuda a limpiar un poco la salida de la consola!
Philipp
1

Solución:

agregue esto 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 );

Funciona cuando jquery-migratese llama con el gancho estándar (que produce <link rel=stylesheet....>) y no con el load-scripts.phpvolumen (como en el panel de administración).

T.Todua
fuente
1

Tenía el mismo problema, y se enteró de que apenas necesita fijar SCRIPT_DEBUGa falseen su wp-config.php. Espero que esto ayude a alguien

Yuri
fuente
2
Eso no me funcionó.
Serj Sagan
-1

Como lo mencionó anteriormente Andy WordPress utiliza el script de migración jQuery para garantizar la compatibilidad con versiones anteriores y es por eso que se carga automáticamente de forma predeterminada.

Aquí hay una forma segura de eliminar el módulo JQuery Migrate y, por lo tanto, deshacerse del molesto aviso JQMIGRATE mientras acelera la carga de su página en el lado del cliente. Simplemente copie / pegue este código en su archivo functions.php y listo:

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


Más detalles

Para obtener más detalles sobre la razón por la que estoy usando una función estática, lea mi artículo aquí:
►► https://en.guydumais.digital/disable-jquery-migrate-in-wordpress/

Guy Dumais Digital
fuente
2
rechazado porque 1. esto huele demasiado a spam y solo hace el mínimo esfuerzo para sentirse como una respuesta. 2. Usted codifica la versión anulando la eliminación de caché.
Mark Kaplun
es una pena porque es un buen enfoque, incluso si lo estás usando add_filtercuando en realidad es una acción.
pcarvalho