Надоедливое "JQMIGRATE: Migrate is..." в консоли после обновления до WordPress 4.5
Почему постоянно появляется уведомление,
JQMIGRATE: Migrate is installed, version 1.4.0
которое указывает на load-scripts.php
в моей консоли после обновления темы до WordPress 4.5, и как его можно убрать?
Это не ошибка, но она всегда присутствует в моей консоли, и я действительно не понимаю, в чем её смысл. Нужно ли что-то обновить или внести изменения в мой код?
Возможно, у меня немного ОКР, но обычно когда я инспектирую сайт, я хочу видеть в консоли ошибки и реальные уведомления, указывающие на проблему...
РЕДАКТИРОВАНИЕ
WordPress 5.5 удалил скрипт jQuery Migrate как подготовительный шаг к обновлению jQuery до последней версии в 5.6. Так что уведомление должно исчезнуть.
https://make.wordpress.org/core/2020/06/29/updating-jquery-version-shipped-with-wordpress/

WordPress использует скрипт jQuery migrate для обеспечения обратной совместимости с любыми плагинами или темами, которые используют функциональность, удаленную из новых версий jQuery.
С выходом WordPress 4.5 версия jQuery migrate была обновлена с v1.2.1 до v1.4.0 - Быстрый просмотр кода показывает, что v1.4.0 записывает в лог загрузку скрипта независимо от того, установлена ли опция migrateMute
, как в несжатой, так и в минифицированной версиях.
Единственный способ убрать это уведомление - убедиться, что код ваших плагинов/темы не зависит от старой функциональности jQuery, а затем удалить скрипт migrate. Существует плагин для этого, но это довольно простой метод, который можно просто разместить в файле functions.php вашей темы или подобном:
add_action('wp_default_scripts', function ($scripts) {
if (!empty($scripts->registered['jquery'])) {
$scripts->registered['jquery']->deps = array_diff($scripts->registered['jquery']->deps, ['jquery-migrate']);
}
});
Обратите внимание, что это не считается лучшей практикой разработки WordPress, и, по моему мнению, скрипт migrate не следует удалять только ради очистки консоли разработчика.

То есть, по сути, один из моих плагинов зависит от функциональности, которая была частью старой версии jQuery? Есть ли способ выяснить, что это за функциональность? Или я могу безопасно отключить скрипт migrate?

Я не могу с уверенностью сказать, зависят ли какие-либо из ваших плагинов от старой функциональности. WordPress просто включает скрипт migrate как безопасное решение по умолчанию на случай, если в вашей установке есть плагины, которые давно не обновлялись. На вашем месте я бы удалил скрипт migrate на локальной копии сайта и проверил, что всё работает как expected, убедившись, что в консоли нет ошибок.

Я не рекомендую это делать. Эта обратная совместимость существует не просто так. Это jQuery-эквивалент удаления файла устаревших функций в WordPress. Все усилия по проверке совместимости вашей текущей конфигурации даже не учитывают возможные изменения настроек или добавление новых плагинов, и учитывая потенциальные проблемы, которые вы можете создать, это не оправдывает сомнительное преимущество удаления сообщения в консоли.

@majick Обсуждение того, является ли удаление скрипта хорошей идеей или нет, выходит за рамки этого ответа. Этот ответ конкретно касается вопроса о том, как убрать сообщение в консоли. Честно говоря, я тоже считаю, что удалять скрипт - плохая идея. Я думаю, что минус неуместен, так как мой ответ идеально отвечает на вопрос автора.

извините, я редко ставлю минусы, но здесь посчитал это необходимым, так как нет предупреждения о том, что это может быть плохой идеей и противоречит лучшим практикам разработки (добавьте предупреждение, и я уберу минус). Я считаю, что в вопросе спрашивается как убрать только сообщение в консоли, а не как удалить сам jquery migrate. Если бы кто-то спросил, как убрать сообщение об обновлении в WordPress, вы бы не ответили "просто удалите WordPress".

@majick предупреждение добавлено. Вы правы в том, что в вопросе спрашивается, как убрать сообщение в консоли. В моем ответе указано, что единственный способ убрать сообщение - это удалить скрипт, что верно, если не идти по пути переписывания нативных функций браузера, как в вашем ответе.

без проблем, минус убран. лично для меня, если бы это действительно раздражало, я бы предпочел просто закомментировать сообщение в файле migrate js при каждом обновлении WP, чем удалять его полностью. просто потому что javascript довольно капризный, иногда одна вещь не на месте, и почти все ломается... это слишком большой риск без какой-либо выгоды, когда это специально предусмотрено, чтобы избежать этого.

Это сообщение об ошибке раздражает, но удалять его на каждом новом сайте - пустая трата времени. Было бы здорово, если бы где-то мы могли вежливо попросить разработчика, кто бы ни добавил это сообщение в WordPress, удалить его в следующем релизе :)

@IvanTopić Оно было добавлено не разработчиками WordPress, а командой jQuery. Судя по всему, они не собираются его удалять: https://github.com/jquery/jquery-migrate/issues/149

Вы можете изменить текст сообщения журнала на пустой в файле jquery-migrate.min.js
, но это не сохранится при обновлении ядра.
Альтернативный вариант - добавить сквозную/фильтрующую функцию-копию console.log
непосредственно перед загрузкой скрипта migrate и указать ей игнорировать сообщения журнала, содержащие 'Migrate is installed
'. Такой подход также сохранит другие предупреждения Migrate:
// скрипт глушителя
function jquery_migrate_silencer() {
// создаем копию функции
$silencer = '<script>window.console.logger = window.console.log; ';
// модифицируем оригинальную функцию для фильтрации и использования копии функции
$silencer .= 'window.console.log = function(tolog) {';
// выходим если пусто, чтобы избежать ошибки
$silencer .= 'if (tolog == null) {return;} ';
// фильтруем сообщения, содержащие строку
$silencer .= 'if (tolog.indexOf("Migrate is installed") == -1) {';
$silencer .= 'console.logger(tolog);} ';
$silencer .= '}</script>';
return $silencer;
}
// для фронтенда используем фильтр script_loader_tag
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();
// добавляем перед загрузкой jquery migrate
$tag = $silencer.$tag;
}
return $tag;
}
// для админки используем хук admin_print_scripts
add_action('admin_print_scripts','jquery_migrate_echo_silencer');
function jquery_migrate_echo_silencer() {echo jquery_migrate_silencer();}
Результатом является добавление одной строки HTML-скрипта как во фронтенд, так и в административную часть, что достигает желаемого эффекта (предотвращает появление сообщения об установке.)

+1 за идею, но если это ваш сайт, вероятно, лучше просто убедиться, что все ваши скрипты совместимы с последней версией и удалить мигратор ;)

да, но я просто не согласен с удалением мигратора как практикой в целом, потому что это не учитывает установку тем/плагинов, которые могут быть еще не совместимы с последней версией jQuery. Как параллель - есть множество плагинов, которые все еще работают нормально, даже несмотря на то, что некоторые функции WordPress "официально" считаются устаревшими. Обратная совместимость - это профилактика, и она лучше лечения, когда дело касается обоих случаев и, в общем, программного обеспечения.

Вы правы, но отсутствие поддержки последней версии jquery - это ошибка, на мой взгляд. 4.5 перешла в стадию RC около месяца назад, и если код не был протестирован на работу со всеми внесенными изменениями, то тема/плагин на самом деле не являются полностью совместимыми. В мире за пределами WordPress сообщения об устаревании в какой-то момент превращаются в реальное устаревание, и вы не захотите откладывать их обработку до того момента, когда вам придется срочно обновляться. Мигратор, на мой взгляд, должен быть временным решением, а не постоянной функцией.

Я согласен, что это временное решение, но именно поэтому сейчас это наиболее важно! Конечно, процесс устаревания внутри WordPress можно оптимизировать, но из-за небольшого размера deprecated.php
сохранение старых псевдонимов функций, которые ссылаются на новые, практически не влияет на производительность и предотвращает поломки. Я предпочту хорошо написанный, но "старый" плагин "новому", но плохо написанному плагину в любой день. Идеология "новое лучше" не должна ломать иначе хорошо работающее программное обеспечение только потому, что "ой, мы изменили название этой функции" и т.д.

Я не согласен с принципами, интернет - это быстро движущаяся цель, и ландшафт постоянно меняется. (к тому времени, когда функция логотипа сайта дошла до версии 4.5, например, сайты уже ушли от идеи иметь только один логотип). Старое хорошо только когда применяется к очень специфическим и стабильным нишам, но jQuery, например, известен как относительно подвижная цель.

Я могу согласиться с тем, что мы не согласны. Просто потому, что есть прогресс и новые функции, это не причина отказываться от старых вещей, которые работают, будь то jQuery, WordPress или тема, или плагин, или что-либо еще... Тестом для любого кода должно быть "работает ли он" или "насколько он хорош", а не "насколько он стар"... и использование критерия "насколько он стар" для работающего программного обеспечения напрямую приводит к его ненужной поломке таким образом... когда новый код является самым багованным! Реалистично говоря, ожидать от разработчиков поддержания обновлений для чего-то, что иначе работало бы идеально - это просто слишком много - это убивает целые бизнесы.

Тема - это не изолированный продукт. Если бы тема включала в себя WordPress и jQuery и т.д., тогда возраст темы имел бы полное значение. Поскольку ни одна тема этого не делает, если тема не была протестирована с используемой версией WordPress, то неясно, какие ошибки могут быть обнаружены. Это просто еще одно проявление дилеммы статической и динамической компоновки. В мире статической компоновки ваше утверждение в основном верно, но WordPress использует динамическую компоновку, и тот факт, что что-то работало с версией 3.5, не означает, что это будет работать с версией 4.5, даже при попытке сохранить обратную совместимость

Небольшой тест.
Я заглянул в jquery-migrate.js и заметил эту часть:
// Установите true, чтобы предотвратить вывод в консоль; migrateWarnings по-прежнему поддерживается
// jQuery.migrateMute = false;
поэтому я протестировал следующее с помощью новой функции wp_add_inline_script()
, представленной в версии 4.5:
add_action( 'wp_enqueue_scripts', function()
{
wp_add_inline_script(
'jquery-migrate', 'jQuery.migrateMute = true;',
'before'
);
} );
Это изменит:
JQMIGRATE: Migrate установлен с активным логированием, версия 1.4.0
на:
JQMIGRATE: Migrate установлен, версия 1.4.0
Таким образом, это фактически не предотвращает весь вывод в консоль, как эта часть в jquery-migrate.js
:
// Показать сообщение в консоли, чтобы разработчики знали, что мы активны
if ( window.console && window.console.log ) {
window.console.log( "JQMIGRATE: Migrate is installed" +
( jQuery.migrateMute ? "" : " with logging active" ) +
", version " + jQuery.migrateVersion );
}

Значит нижний код просто убирает сообщение, верно? То есть, migrate остается, но сообщение подавляется, так? Это лучше, чем полностью удалять migrate

нет, это копия кода, создающего сообщение в консоли, которое действительно выводится. Это показывает, что migrateMute проверяется только для второй половины сообщения консоли - первая половина выводится в любом случае... Удаление этого блока кода уберет сообщение консоли, но вам придется делать это заново после каждого обновления WP.

Спасибо за исследование и подробности! На мой взгляд, это лучший вариант, так как удаление JQmigrate не всегда хорошая идея, потому что многие плагины WP зависят от устаревших функций jQuery. Это решение помогает немного очистить вывод консоли!

Если вы также хотите удалить их в админке, вы можете дать анонимной функции имя и вызвать её как для wp_enqueue_scripts
, так и для admin_enqueue_scripts
.

Решение:
добавьте это в 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 );
Это работает, когда jquery-migrate
вызывается стандартным хуком (который выводит <link rel=stylesheet....>
), а не через load-scripts.php
в общей загрузке (как в панели администратора).

Просто измените консоль инспектора при необходимости
Вместо жесткого кодирования чего-либо на вашем сайте, большинство инспекторов предоставляют метод для локального редактирования вывода консоли.
Для Chrome и Opera
Используя консоль инспектора, вы можете кликнуть правой кнопкой мыши на предупреждение JQMIGRATE ...
и нажать 'Скрыть сообщения из jquery-migrate.js'.
Фильтр консоли
Это добавит '-url:<YOUR_WORDPRESS_URL>/wp-includes/js/jquery/jquery-migrate.js?ver=3.3.2'
в фильтр консоли. Эффективно исключая этот URL из вывода консоли.
Примечание: если вы копируете вышеуказанное в фильтры, замените <YOUR_WORDPRESS_URL>
на ваш wp url
Этот фильтр консоли постоянно применяется также к новым вкладкам и окнам.
Safari
Для Safari вы можете легко создать локальное переопределение ответа в инспекторе.
Кликните правой кнопкой мыши на jquery-migrate.js:line
справа от вывода консоли, затем выберите 'Создать локальное переопределение ответа'.
Это означает, что вы редактируете файл локально для целей разработки. Чтобы убрать эти уведомления о миграции, добавьте это в начало файла jquery-migrate.js
в вашем локальном переопределении ответа.
/**
* Локальное переопределение ответа
*/
jQuery.migrateMute = true;
Firefox
Локальные переопределения в настоящее время не поддерживаются. https://support.mozilla.org/en-US/questions/1331771
Фильтр вывода консоли на основе вкладки/окна
Введите -jquery-migrate.js
в строку 'Фильтр вывода', и уведомления jQuery migrate исчезнут даже при перезагрузке вкладки.
Предупреждение: этот фильтр консоли нужно будет применять каждый раз при открытии новой вкладки или окна Firefox.
Надеюсь, это поможет!

2023
Этот комментарий из этого места:
Вот код, который отключает все console.trace:
<?php
function _jqmigrate_mute() {
wp_add_inline_script('jquery-migrate', 'jQuery.migrateMute = true;', 'before');
}
add_action('wp_enqueue_scripts', '_jqmigrate_mute');
add_action('admin_enqueue_scripts', '_jqmigrate_mute');
Это не отключает начальное объявление, но в остальном экономит огромное количество места.
