Irytujące „JQMIGRATE: Migracja jest…” w konsoli po aktualizacji do WordPress 4.5

53

Dlaczego istnieje ciągłe powiadomienie,

JQMIGRATE: Migracja jest zainstalowana, wersja 1.4.0

wskazuje to load-scripts.phpw mojej konsoli, kiedy zaktualizowałem motyw do WordPress 4.5 i jak można go usunąć?

To nie jest błąd, ale zawsze jest obecny w mojej konsoli i naprawdę nie rozumiem, o co chodzi. Czy powinienem coś zaktualizować lub wprowadzić zmiany w kodzie?

Może mam trochę OCD, ale zwykle podczas inspekcji witryny lubię widzieć błędy i prawdziwe powiadomienia wskazujące na problem w mojej konsoli ...

dingo_d
źródło
+1 do twojej bardzo przydatnej OCD. Prawdopodobnie pochodzi to od skryptu migracji jquery / wstecznej kompatybilności. Czy jest jakaś szansa, że ​​użyjesz jej wersji nieupoważnionej / deweloperskiej?
Mark Kaplun 24.04.16
Nieuprawniona wersja migracji?
Według
1
pamiętać, obie wersje są katalogów WP: /wp-admin/js/jquery/jquery-migrate.jsa/wp-admin/js/jquery/jquery-migrate.min.js
majick

Odpowiedzi:

50

WordPress używa skryptu migracyjnego jQuery, aby zapewnić zgodność wsteczną dla wszystkich wtyczek i motywów, których możesz używać, które używają funkcji usuniętych z nowszych wersji jQuery.

Wydaje się, że wraz z wydaniem WordPress 4.5 zaktualizowali wersję migracji jQuery z wersji 1.2.1 do wersji 1.4.0 - Szybkie skanowanie kodu ujawnia, że ​​wersja 1.4.0 rejestruje, że skrypt jest ładowany niezależnie od tego, czy migrateMuteopcja jest ustawiona zarówno w wersji nieskompresowanej, jak i zminimalizowanej.

Jedynym sposobem na usunięcie powiadomienia jest upewnienie się, że wszystkie wtyczki / kod motywu nie są uzależnione od żadnej starej funkcji jQuery, a następnie usunięcie skryptu migracji. Istnieje wtyczka , aby to zrobić, ale jest to dość prosta metoda, którą można po prostu umieścić w pliku funkcji motywu lub podobnym:

add_action('wp_default_scripts', function ($scripts) {
    if (!empty($scripts->registered['jquery'])) {
        $scripts->registered['jquery']->deps = array_diff($scripts->registered['jquery']->deps, ['jquery-migrate']);
    }
});

Należy pamiętać, że nie jest to uważane za najlepszą praktykę w tworzeniu WordPress i moim zdaniem skryptu migracji nie należy usuwać tylko ze względu na utrzymanie konsoli programisty w czystości.

Andy
źródło
Więc w zasadzie jedna z moich wtyczek zależy od funkcjonalności, która była częścią starej wersji jQuery? Czy istnieje sposób, aby dowiedzieć się, co to za funkcjonalność? Czy mogę bezpiecznie wyciszyć migrowany skrypt?
dingo_d 24.04.16
1
Nie mogę powiedzieć na pewno, czy któraś z twoich wtyczek zależy od starej funkcjonalności, WordPress po prostu włącza skrypt migracji jako bezpieczne domyślne na wypadek, gdyby Twoja instalacja zawierała jakieś wtyczki, które nie były aktualizowane od dłuższego czasu. Gdybym to był ja, usunęłbym skrypt migrujący z lokalnej instalacji witryny, a następnie sprawdziłem, czy wszystko nadal działa zgodnie z oczekiwaniami, upewniając się, że nie ma błędów w konsoli itp.
Andy
Odradzam to. Ta kompatybilność wsteczna istnieje z jakiegoś powodu. Jest to odpowiednik jQuery usuwania przestarzałego pliku funkcji w WordPress. Zadanie sobie trudu sprawdzenia, czy bieżąca konfiguracja jest w pełni kompatybilna, nie uwzględnia nawet zmian konfiguracji lub dodatków do wtyczek, a biorąc pod uwagę potencjalne problemy, które możesz stworzyć, nie równoważy się z całkowicie wątpliwą korzyścią z usunięcia komunikatu dziennika konsoli .
majick
1
@ maajick Dyskusja, czy usunięcie skryptu jest dobrym pomysłem, czy nie, jest poza zakresem tej odpowiedzi, dotyczy to w szczególności sposobu usunięcia komunikatu z konsoli. FWIW, myślę, że usunięcie skryptu to również zły pomysł. Myślę, że głosowanie negatywne jest nieuzasadnione, ponieważ moja odpowiedź doskonale odpowiada na pytanie PO.
Andy,
1
przepraszam, że nie głosuję często, ale uważam, że jest to potrzebne tutaj, ponieważ nie ma ostrzeżenia, że ​​może to nie być dobry pomysł i jest przeciwieństwem najlepszych praktyk w rozwoju (dodaj ostrzeżenie, a ja usunę głosowanie). I wierzę, że pytanie dotyczy tego, jak usunąć tylko komunikat konsoli, a nie jak usunąć migrację jquery. jeśli ktoś zapyta, jak usunąć komunikat o aktualizacji w WordPress, nie odpowiedziałbyś „po prostu odinstaluj WordPress”.
majick
11

Możesz zmienić tekst komunikatu w dzienniku na pusty, jquery-migrate.min.jsale nie zostanie on zachowany podczas podstawowej aktualizacji.

Alternatywą jest dodanie do funkcji kopiowania / filtrowania funkcji console.logtuż przed załadowaniem skryptu migracji i nakazanie ignorowania komunikatów rejestrowania zawierających „ Migrate is installed”. W ten sposób zachowane zostaną również inne ostrzeżenia 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();}

Rezultatem jest jeden wiersz skryptu HTML dodany zarówno do frontendu, jak i backendu, który osiąga pożądany efekt (zapobiega zainstalowanej wiadomości).

majick
źródło
1
+1 za pomysł, ale jeśli to Twoja witryna, prawdopodobnie lepiej jest po prostu upewnić się, że wszystkie skrypty są zgodne z najnowszą wersją i usunąć migratora;)
Mark Kaplun,
tak, ale po prostu nie zgadzam się na usunięcie migratora jako praktyki, ponieważ nie bierze on pod uwagę instalowania motywów / wtyczek, które mogą nie być jeszcze zgodne z najnowszą wersją jQuery. równolegle istnieje wiele wtyczek, które nadal działają dobrze, nawet jeśli nie zrealizowały one tutaj funkcji WordPress lub są „oficjalnie” przestarzałe. wsteczna kompatybilność to zapobieganie i lepsze niż lekarstwo, zarówno w przypadku obu przypadków, jak i oprogramowania ogólnie.
majick
2
Masz rację, ale brak obsługi najnowszej wersji jquery to błąd IMO. 4.5 weszło do RC około miesiąc temu, a jeśli kod nie został przetestowany pod kątem współpracy ze wszystkimi wprowadzonymi przez niego zmianami, to motyw / wtyczka nie są naprawdę kompatybilne. W świecie poza Wordpress deprecation wiadomości stają się w pewnym momencie rzeczywistą deprecjacją i nie chcesz pozostawiać obsługi ich do czasu, kiedy musisz zaktualizować jak najszybciej. IMO migratora powinno być rozwiązaniem tymczasowym, a nie stałym.
Mark Kaplun,
2
Nie zgadzam się tutaj z głównymi stronami, internet jest szybko zmieniającym się celem, a krajobraz cały czas się zmienia. (na przykład do czasu, aż na przykład funkcja logo witryny zmieniła się na 4.5, strony przeszły od pomysłu posiadania tylko jednego logo). Stare jest dobre tylko w przypadku zastosowania do bardzo specyficznych i stabilnych nisz, ale na przykład jQuery jest stosunkowo ruchomym celem.
Mark Kaplun,
1
Temat nie jest produktem izolowanym. Gdyby tematem było pakowanie wordpress i jquery itp., Wówczas wiek motywu byłby całkowicie odpowiedni. Ponieważ żaden motyw tego nie robi, jeśli motyw nie został przetestowany pod kątem używanej wersji wordpress, nie jest wystarczająco jasne, jakie błędy zostaną wykryte. To tylko kolejny przejaw dylematu statycznego vs. dynamicznego łączenia. W statycznej łączącej świat roszczenie jest w większości prawdziwe, ale wordpress jest dynamiczne łączenie i tylko dlatego, że coś pracował z 3,5 nie oznacza to będzie działać z 4,5 nawet z próbą bycia backcompatible
Mark Kaplun
7

Tylko mały test tutaj.

Zajrzałem do jquery-migrate.js i zauważyłem tę część:

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

więc przetestowałem następujące z nowo wp_add_inline_script()wprowadzonym w wersji 4.5:

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

To zmieni:

JQMIGRATE: Migracja jest instalowana z aktywnym rejestrowaniem, wersja 1.4.0

do:

JQMIGRATE: Migracja jest zainstalowana, wersja 1.4.0

Więc tak naprawdę nie zapobiega całej produkcji konsoli, jak ta część w 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
źródło
1
Więc dolny kod po prostu usuwa wiadomość, prawda? Mam na myśli, że migracja zostaje, ale wiadomość jest pomijana, prawda? Jest to lepsze niż definitywne usunięcie migracji
dingo_d
1
Nie, że jest kopią kodu produkujących komunikat dziennika konsoli, który robi wyjście. pokazuje, że migrateMute jest testowany tylko dla drugiej połowy komunikatu konsoli - pierwsza połowa jest wyprowadzana niezależnie od ... usunięcie tego bloku kodu spowoduje usunięcie komunikatu konsoli, ale należy powtórzyć każdą aktualizację WP.
majick
2
Dzięki za badania i szczegóły! IMO najlepsza opcja, ponieważ usunięcie JQmigrate nie zawsze jest dobrym pomysłem, ponieważ wiele wtyczek WP zależy od przestarzałych funkcji jQuery. To rozwiązanie pomaga nieco oczyścić konsolę!
Philipp
1

Rozwiązanie:

dodaj to do 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 );

Działa, gdy jquery-migratejest wywoływany ze standardowym hakiem (który wyprowadza <link rel=stylesheet....>), a nie load-scripts.phpzbiorczo (jak w panelu administracyjnym).

T.Todua
źródło
1

Miałem ten sam problem, i okazało się, po prostu trzeba ustawić SCRIPT_DEBUGsię falsew twojej wp-config.php. Mam nadzieję, że to komuś pomoże

Jurij
źródło
2
To nie działało dla mnie.
Serj Sagan,
-1

Jak wspomniano wcześniej przez Andy WordPress używa skryptu migracyjnego jQuery, aby zapewnić kompatybilność wsteczną i dlatego jest domyślnie ładowany automatycznie.

Oto bezpieczny sposób na usunięcie modułu JQuery Migrate, a tym samym pozbycie się irytującego powiadomienia JQMIGRATE przy jednoczesnym przyspieszeniu wczytywania strony po stronie klienta. Po prostu skopiuj / wklej ten kod do pliku functions.php i gotowe:

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


Więcej szczegółów

Aby uzyskać więcej informacji na temat powodu używania funkcji statycznej, przeczytaj mój artykuł tutaj:
►► https://en.guydumais.digital/disable-jquery-migrate-in-wordpress/

Guy Dumais Digital
źródło
2
przegłosowano, ponieważ 1. to pachnie zbyt mocno spamem i po prostu wkłada minimalny wysiłek, aby poczuć się jak odpowiedź. 2. Twarde kodowanie pomija pamięć podręczną wersji.
Mark Kaplun,
szkoda, ponieważ jest to miłe podejście, nawet jeśli używasz, add_filtergdy jest to właściwie akcja.
pcarvalho