Ärgerlich "JQMIGRATE: Migrieren ist ..." in der Konsole nach dem Update auf WordPress 4.5

53

Warum gibt es eine ständige Ankündigung,

JQMIGRATE: Migrate ist installiert, Version 1.4.0

Das zeigt load-scripts.phpin meiner Konsole, als ich mein Theme auf WordPress 4.5 aktualisiert habe, und wie kann es entfernt werden?

Es ist kein Fehler, aber es ist immer in meiner Konsole vorhanden, und ich verstehe wirklich nicht, worum es geht. Sollte ich etwas aktualisieren oder Änderungen an meinem Code vornehmen?

Vielleicht habe ich ein bisschen Zwangsstörung, aber wenn ich die Site inspiziere, sehe ich normalerweise gerne Fehler und echte Hinweise, die auf ein Problem in meiner Konsole hinweisen ...

dingo_d
quelle
+1 zu Ihrer sehr nützlichen OCD. Dies stammt wahrscheinlich aus dem JQuery-Migrations- / Rückwärtskompatibilitätsskript. Gibt es eine Chance, dass Sie eine nicht minimierte / dev-Version davon verwenden?
Mark Kaplun
Nicht abgeschlossene Version von migrate? Meines Wissens nach könnten es einige Plugins sein, aber bei der Überprüfung sehe ich nichts davon: \
dingo_d
1
Beachten Sie, dass beide Versionen in WP dirs sind: /wp-admin/js/jquery/jquery-migrate.jsund/wp-admin/js/jquery/jquery-migrate.min.js
Majick

Antworten:

50

WordPress verwendet das jQuery-Migrationsskript, um die Abwärtskompatibilität für alle Plugins oder Themen zu gewährleisten, die Sie möglicherweise verwenden und deren Funktionalität aus neueren Versionen von jQuery entfernt wurde.

Mit der Veröffentlichung von WordPress 4.5 scheint die Version von jQuery migrate von v1.2.1 auf v1.4.0 aktualisiert worden zu sein. Wenn der Code schnell durchsucht wird , wird angezeigt , dass v1.4.0 protokolliert, dass das Skript geladen wurde, unabhängig davon, ob das Skript geladen wurde oder nicht migrateMuteDie Option ist gesetzt und sowohl in der unkomprimierten als auch in der verkleinerten Version verfügbar.

Die einzige Möglichkeit, den Hinweis zu entfernen, besteht darin, sicherzustellen, dass alle Plugins / Themencodes nicht auf alten jQuery-Funktionen basieren, und anschließend das Migrationsskript zu entfernen. Es gibt ein Plugin , um dies zu tun, aber es ist eine ziemlich einfache Methode, die einfach in die Funktionsdatei Ihres Themas oder ähnliches eingefügt werden kann:

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

Bitte beachten Sie, dass dies nicht als Best Practice für die WordPress-Entwicklung angesehen wird. Meiner Meinung nach sollte das Migrationsskript nicht entfernt werden, nur um die Entwicklerkonsole sauber zu halten.

Andy
quelle
Also hängt eines meiner Plugins von einer Funktionalität ab, die Teil der alten jQuery-Version war? Gibt es eine Möglichkeit herauszufinden, was diese Funktionalität ist? Oder kann ich das Migrationsskript einfach stumm schalten?
Dingo_d
1
Ich kann nicht sicher sagen, ob eines Ihrer Plugins von der alten Funktionalität abhängt. WordPress enthält lediglich das Migrationsskript als sicheren Standard, falls Ihre Installation Plugins enthält, die seit einiger Zeit nicht mehr aktualisiert wurden. Wenn ich es wäre, würde ich das Migrationsskript bei einer lokalen Installation der Site entfernen und dann überprüfen, ob alles weiterhin wie erwartet funktioniert, um sicherzustellen, dass keine Fehler in der Konsole usw. vorliegen.
Andy,
Ich empfehle dagegen. Diese Abwärtskompatibilität ist nicht ohne Grund gegeben. Es ist das jQuery-Äquivalent zum Löschen veralteter Funktionsdateien in WordPress. Wenn Sie sich die Mühe machen, zu überprüfen, ob Ihr aktuelles Setup vollständig kompatibel ist, werden Änderungen am Setup oder das Hinzufügen von Plug-ins nicht berücksichtigt. Angesichts der potenziellen Probleme, die Sie verursachen würden, wird der völlig zweifelhafte Vorteil des Entfernens einer Konsolenprotokollnachricht nicht abgewogen .
Majick
1
@majick Es würde den Rahmen dieser Antwort sprengen, zu diskutieren, ob das Entfernen des Skripts eine gute Idee ist oder nicht. Dies befasst sich speziell mit der Frage, wie die Nachricht in der Konsole entfernt wird. FWIW, ich denke, dass das Entfernen des Skripts auch eine schlechte Idee ist. Ich denke, die Ablehnung ist unangebracht, da meine Antwort die Frage des OP perfekt beantwortet.
Andy
1
Es tut mir leid, dass ich nicht oft abgelehnt habe, aber ich habe das Gefühl, dass dies hier notwendig ist, da es keine Warnung gibt, dass dies möglicherweise keine gute Idee ist und das Gegenteil von Best Practice in der Entwicklung ist. (Fügen Sie eine Warnung hinzu und ich werde die Ablehnung entfernen.) I Ich glaube, die Frage ist, wie man nur die Konsolenmeldung entfernt und nicht, wie man jquery migrate selbst entfernt. Wenn jemand fragte, wie man die Update-NAG-Nachricht in WordPress entfernt, würde er nicht antworten: "Deinstalliere einfach WordPress."
Majick
11

Sie können den Protokollnachrichtentext so ändern jquery-migrate.min.js, dass er nicht mehr angezeigt wird , dies wird jedoch bei der Kernaktualisierung nicht beibehalten.

Die Alternative besteht darin, eine Durchgriffs- / Filterfunktionskopie von bis hinzuzufügen console.log, bevor das Migrationsskript geladen wird, und es anzuweisen , Protokollnachrichten zu ignorieren, die " Migrate is installed" enthalten . Auf diese Weise werden auch andere Migrate-Warnungen beibehalten:

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

Das Ergebnis ist eine Zeile HTML-Skript, die sowohl dem Frontend als auch dem Backend hinzugefügt wird und den gewünschten Effekt erzielt (die installierte Nachricht wird verhindert).

Majick
quelle
1
+1 für die Idee, aber wenn es Ihre Website ist, ist es wahrscheinlich besser, nur um sicherzustellen, dass alle Ihre Skripte mit der neuesten Version kompatibel sind und entfernen Sie den Migrator;)
Mark Kaplun
Ja, aber ich bin mit dem Entfernen des Migrators überhaupt nicht einverstanden, da die Installation von Designs / Plugins, die möglicherweise noch nicht mit der neuesten jQuery kompatibel sind, nicht berücksichtigt wird. Als Parallele gibt es eine Menge Plugins, die immer noch gut funktionieren, auch wenn sie hier oder da möglicherweise keine WordPress-Funktion realisiert haben oder "offiziell" veraltet sind. Abwärtskompatibilität ist Vorbeugung und besser als Heilung, wenn es um beide Fälle und auch um Software im Allgemeinen geht.
Majick
2
Sie haben Recht, aber nicht die neueste jquery-Version zu unterstützen, ist ein Fehler IMO. 4.5 ist vor ungefähr einem Monat in RC eingestiegen, und wenn Code nicht getestet wurde, um mit allen eingeführten Änderungen zu funktionieren, sind das Theme / Plugin nicht wirklich kompatibel. In der Welt außerhalb von WordPress verwandeln sich Nachrichten zu einem bestimmten Zeitpunkt in tatsächliche Nachrichten, und Sie möchten die Bearbeitung nicht dem Zeitpunkt überlassen, an dem Sie ein Upgrade so schnell wie möglich durchführen müssen. Das Migrator-IMO sollte eine temporäre Lösung sein, keine permanente Funktion.
Mark Kaplun
2
Ich bin nicht einverstanden mit Prinzipien hier, das Internet ist ein sich schnell bewegendes Ziel und die Landschaft verändert sich ständig. (Als die Website-Logo-Funktion beispielsweise auf 4.5 umgestellt wurde, gingen die Websites von der Idee aus, nur ein Logo zu haben). Alt ist nur dann gut, wenn es auf sehr spezifische und stabile Nischen angewendet wird, aber jQuery ist beispielsweise als relativ bewegliches Ziel bekannt.
Mark Kaplun
1
Ein Thema ist kein isoliertes Produkt. Wenn ein Thema WordPress und JQuery usw. verpackt hätte, dann wäre das Alter des Themas absolut relevant gewesen. Da dies kein Thema ist, ist es nicht klar genug, welche Art von Fehlern entdeckt werden, wenn das Thema nicht mit der verwendeten WordPress-Version getestet wurde. Dies ist nur eine weitere Manifestation des statischen vs. dynamischen Verknüpfungsdilemmas. In einer statischen Linkwelt ist Ihre Behauptung größtenteils wahr, aber WordPress ist eine dynamische Verlinkung, und nur weil etwas mit 3.5 funktioniert hat, heißt das nicht, dass es mit 4.5 funktioniert, auch wenn versucht wird, rückkompatibel zu sein
Mark Kaplun,
7

Nur ein kleiner Test hier.

Ich warf einen Blick auf jquery-migrate.js und bemerkte diesen Teil:

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

so habe ich folgendes mit dem wp_add_inline_script()in version 4.5 neu eingeführten getestet :

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

Dies wird sich ändern:

JQMIGRATE: Migrate wird mit aktivierter Protokollierung, Version 1.4.0, installiert

zu:

JQMIGRATE: Migrate ist installiert, Version 1.4.0

Es verhindert also nicht die gesamte Konsolenausgabe, wie dieser Teil 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 );
}
birgire
quelle
1
Der untere Code entfernt also nur die Nachricht, oder? Ich meine, die Migration bleibt, aber die Nachricht wird unterdrückt, oder? Dies ist auf jeden Fall besser als das Entfernen der Migration
dingo_d
1
nein, das ist eine Kopie des Codes, der die Konsolenprotokollnachricht erzeugt, die ausgegeben wird. es zeigt, dass migrateMute nur für die zweite Hälfte der Konsolennachricht getestet wird - die erste Hälfte wird unabhängig davon ausgegeben ... Durch Entfernen dieses Codeblocks wird die Konsolennachricht entfernt, aber Sie müssten jedes WP-Update wiederholen.
Majick
2
Vielen Dank für die Recherche und Details! IMO ist die beste Option, da das Entfernen von JQmigrate nicht immer eine gute Idee ist, da viele WP-Plugins von veralteten jQuery-Funktionen abhängen. Diese Lösung hilft, die Konsolenausgabe ein wenig aufzuräumen!
Philipp
1

Lösung:

füge dies zu functions.php hinzu:

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

Es funktioniert, wenn jquery-migratemit Standard-Hook (welche Ausgaben <link rel=stylesheet....>) und nicht mit load-scripts.phpin loser Schüttung (wie im Admin-Dashboard) aufgerufen wird .

T.Todua
quelle
1

Hatte das gleiche Problem, und fand heraus , Sie müssen nur eingestellt , SCRIPT_DEBUGum falsein Ihrem wp-config.php. Hoffe das hilft jemandem

Yuri
quelle
2
Das hat bei mir nicht geklappt.
Serj Sagan
-1

Wie bereits erwähnt, verwendet Andy WordPress das jQuery-Migrationsskript, um die Abwärtskompatibilität sicherzustellen. Aus diesem Grund wird es standardmäßig automatisch geladen.

Hier ist eine sichere Möglichkeit, das JQuery Migrate-Modul zu entfernen und so den nervigen JQMIGRATE-Hinweis zu beseitigen, während das Laden Ihrer Seite auf der Clientseite beschleunigt wird. Kopieren Sie einfach diesen Code in Ihre functions.php- Datei und Sie sind fertig:

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


Mehr Details

Weitere Informationen zum Grund für die Verwendung einer statischen Funktion finden Sie in meinem Artikel hier:
►► https://en.guydumais.digital/disable-jquery-migrate-in-wordpress/

Guy Dumais Digital
quelle
2
Abgestimmt, weil 1. dies zu stark nach Spam riecht und nur den minimalen Aufwand unternimmt, um sich wie eine Antwort zu fühlen. 2. Sie haben die Version, die das Busting des Cache zunichte macht, hart codiert.
Mark Kaplun
Es ist eine Schande, denn es ist eine nette Herangehensweise, auch wenn du sie verwendest, add_filterwenn es tatsächlich eine Aktion ist.
Pcarvalho