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 ...

dingo_d
fonte
+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.

Andy
fonte
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).

majick
fonte
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 );
}
Birgire
fonte
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).

T.Todua
fonte
1

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

Yuri
fonte
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/

Guy Dumais Digital
fonte
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