Irritante “JQMIGRATE: Migrate is…” no console após a atualização para o WordPress 4.5


53

Por que há um aviso constante,

JQMIGRATE: Migrate está instalado, versão 1.4.0

que aponta para o load-scripts.phpmeu console quando atualizei meu tema para o WordPress 4.5 e como ele pode ser removido?

Não é um erro, mas está sempre presente no meu console, e eu realmente não vejo qual é o sentido disso. Devo atualizar algo ou fazer algumas alterações no meu código?

Talvez eu tenha um pouco de TOC, mas geralmente quando inspeciono o site, gosto de ver erros e avisos reais que apontam para um problema no meu console ...


+1 ao seu TOC muito útil. Provavelmente, isso vem do script de migração / compatibilidade com versões anteriores do jquery. Alguma chance de você usar a versão desminificada / dev?
— Mark Kaplun

Versão não minificada da migração? Não que eu saiba não, pode haver alguns plugins, mas após a inspeção não vejo nada disso: \
— dingo_d 24/04/16

11
Observe as duas versões estão em dirs WP: /wp-admin/js/jquery/jquery-migrate.jse/wp-admin/js/jquery/jquery-migrate.min.js
— majick

Respostas:


50

O WordPress usa o script de migração do jQuery para garantir a compatibilidade com versões anteriores de quaisquer plugins ou temas que você possa estar usando, que usam a funcionalidade removida das versões mais recentes do jQuery.

Com o lançamento do WordPress 4.5, parece que eles atualizaram a versão do jQuery migrate da v1.2.1 para a v1.4.0 - Uma rápida varredura no código revela que a v1.4.0 registra o carregamento do script independentemente de o migrateMuteopção está definida e nas versões descompactada e minificada.

A única maneira de remover o aviso é garantir que todos os seus plugins / códigos de tema não confiem em nenhuma funcionalidade antiga do jQuery e remova o script de migração. Existe um plugin para fazer isso, mas é um método bastante simples que pode ser colocado no arquivo de funções do seu tema ou 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']);
    }
});

Observe que isso não é considerado uma prática recomendada para o desenvolvimento do WordPress e, na minha opinião, o script de migração não deve ser removido apenas para manter o console do desenvolvedor limpo.


Então, basicamente, um dos meus plugins depende de uma funcionalidade que fazia parte da versão antiga do jQuery? Existe uma maneira de descobrir o que é essa funcionalidade? Ou estou seguro para silenciar o script de migração?
— dingo_d

11
Não posso dizer com certeza se algum de seus plugins depende de funcionalidades antigas, o WordPress inclui apenas o script de migração como um padrão seguro, caso sua instalação possua plugins que não tenham sido atualizados há algum tempo. Se fosse comigo eu iria remover o script de migração em uma instalação local do site e, em seguida, verificar tudo ainda funciona como esperado, garantindo que não há erros no console etc.
— Andy

Eu recomendo contra isso. Essa compatibilidade com versões anteriores existe por um motivo. É o equivalente jQuery de excluir o arquivo de funções obsoletas no WordPress. O esforço para verificar se a sua configuração atual é totalmente compatível nem leva em conta alterações de configuração ou acréscimos de plug-in, e dados os possíveis problemas que você estaria criando não se equilibram com o benefício completamente duvidoso de remover uma mensagem de log do console .
— majick

11
@majick Está além do escopo desta resposta discutir se a remoção do script é uma boa ideia ou não, isso aborda especificamente a questão de como remover a mensagem no console. FWIW, acho que remover o script também é uma má ideia. Acho que o voto negativo não é necessário, pois minha resposta responde perfeitamente à pergunta dos OPs.
— 21716 Andy

11
desculpe, eu não diminuo o voto muitas vezes, mas senti que era necessário aqui, pois não há aviso de que isso pode não ser uma boa idéia e é o oposto das melhores práticas de desenvolvimento (adicione um aviso e removerei o voto negativo). acredito que a pergunta está perguntando como remover apenas a mensagem do console e não como remover o jquery migrate. se alguém perguntasse como remover a mensagem de atualização no WordPress, você não responderia "apenas desinstale o WordPress".
— majick

11

Você pode alterar o texto da mensagem de log para em branco, jquery-migrate.min.jsmas isso não será preservado na atualização principal.

A alternativa é adicionar a cópia da função de passagem / filtro console.logimediatamente antes do carregamento do script de migração e pedir para ele ignorar as mensagens de log que contêm ' Migrate is installed'. Fazer isso dessa forma preservará outros avisos do Migrate também:

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

O resultado é uma linha de script HTML adicionada ao front-end e ao back-end que obtém o efeito desejado (impede a mensagem instalada).


11
+1 para a idéia, mas se é o seu site, provavelmente é melhor apenas para certificar-se de todos os seus scripts são compatíveis com a versão mais recente e remova o migrador;)
— Mark Kaplun

sim, mas simplesmente não concordo em remover o migrador como prática, porque ele não leva em consideração a instalação de temas / plugins que podem não ser compatíveis com o jQuery mais recente ainda. como um paralelo, existem muitos plugins que ainda funcionam bem, mesmo que eles não tenham realizado uma função do WordPress aqui ou haja "oficialmente" reprovado. a compatibilidade com versões anteriores é uma prevenção e melhor do que uma cura quando se trata de casos e também de software em geral.
— majick

2
Você está certo, mas não suportar a versão mais recente do jquery é um IMO de bug. 4.5 entrou no RC cerca de um mês atrás, e se o código não foi testado para funcionar com todas as alterações introduzidas, o tema / plugin não é verdadeiramente compatível. No mundo exterior, as mensagens de depreciação do wordpress se transformam em depreciação real em algum momento, e você não deseja deixar de manipulá-las até o momento em que precisa atualizar o mais rápido possível. O IMO do migrador deve ser uma solução temporária, não um recurso permanente.
— precisa saber é o seguinte

2
Eu discordo dos diretores aqui, a internet é um alvo em movimento rápido e a paisagem está mudando o tempo todo. (quando o recurso de logotipo do site foi levado para 4.5, por exemplo, os sites passaram da ideia de ter apenas um logotipo). Antigo só é bom quando aplicado a nichos muito específicos e estáveis, mas o jQuery, por exemplo, é conhecido como um destino relativamente móvel.
— precisa

11
Um tema não é um produto isolado. Se um tema estivesse empacotando wordpress e jquery etc, então a idade do tema teria sido totalmente relevante. Como nenhum tema faz isso, se o tema não foi testado com relação à versão do wordpress sendo usada, não está claro o suficiente que tipo de bugs serão descobertos. Essa é apenas outra manifestação do dilema de vinculação estática versus dinâmica. Em um mundo vinculação estática sua reivindicação é principalmente verdade, mas wordpress é a vinculação dinâmica e só porque algo tinha trabalhado com 3.5 não significa que irá trabalhar com o 4.5 mesmo com a tentativa de ser backcompatible
— Mark Kaplun

7

Apenas um pequeno teste aqui.

Eu espiei o jquery-migrate.js e notei esta parte:

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

então testei o seguinte com o recém- wp_add_inline_script()lançado na versão 4.5:

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

Isso vai mudar:

JQMIGRATE: Migrate está instalado com o log ativo, versão 1.4.0

para:

JQMIGRATE: Migrate está instalado, versão 1.4.0

Portanto, na verdade, não impede toda a saída do console, como esta parte em 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 );
}

11
Então o código inferior apenas remove a mensagem, certo? Quero dizer, a migração permanece, mas a mensagem é suprimida, certo? Isto é melhor do que remover a migrar definitivamente
— dingo_d

11
não, isso é uma cópia do código que produz a mensagem de log do console que sai . mostra que migrateMute é testado apenas para a segunda metade da mensagem do console - a primeira metade é emitida independentemente ... remover esse bloco de código removerá a mensagem do console, mas você precisará refazer cada atualização do WP.
— majick

2
Obrigado pela pesquisa e detalhes! A IMO é a melhor opção, pois a remoção do JQmigrate nem sempre é uma boa ideia, porque muitos plug-ins do WP dependem de funções jQuery obsoletas. Esta solução ajuda a limpar um pouco a saída do console!
— 28517 Philipp Philipp

1

Solução:

adicione isso ao 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 quando jquery-migrateé chamado com gancho padrão (que gera <link rel=stylesheet....>) e não com a load-scripts.phpgranel (como no painel de administração).


1

Tive o mesmo problema, e descobri que você só precisa definir SCRIPT_DEBUGa falsesua wp-config.php. Espero que isso ajude alguém


2
Isso não funcionou para mim.
— Serj Sagan

-1

Conforme mencionado anteriormente por Andy, o WordPress usa o script de migração do jQuery para garantir a compatibilidade com versões anteriores, e é por isso que ele é carregado automaticamente por padrão.

Aqui está uma maneira segura de remover o módulo JQuery Migrate e, assim, livrar-se do aviso irritante do JQMIGRATE enquanto acelera o carregamento da sua página no lado do cliente. Simplesmente copie / cole este código no seu arquivo functions.php e pronto:

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


Mais detalhes

Para obter mais detalhes sobre o motivo pelo qual estou usando uma função estática, leia meu artigo aqui:
►► https://en.guydumais.digital/disable-jquery-migrate-in-wordpress/


2
diminuiu porque 1. isso cheira muito a spam e apenas faz o esforço mínimo para parecer uma resposta. 2. Você codifica a versão que anula a interrupção do cache.
— 27418 Mark Kaplun

é uma pena, porque é uma boa abordagem, mesmo que você esteja usando add_filterquando na verdade é uma ação.
— pcarvalho 20/09/18
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.