Раздражает «JQMIGRATE: миграция ...» в консоли после обновления до WordPress 4.5


53

Почему есть постоянное уведомление,

JQMIGRATE: Миграция установлена, версия 1.4.0

на что указывает load-scripts.phpмоя консоль, когда я обновляю свою тему до WordPress 4.5, и как ее можно удалить?

Это не ошибка, но она всегда присутствует в моей консоли, и я действительно не понимаю, какой в ​​этом смысл. Должен ли я что-то обновить или внести некоторые изменения в мой код?

Может быть, у меня есть немного OCD, но обычно, когда я осматриваю сайт, мне нравится видеть ошибки и реальные уведомления, указывающие на проблему в моей консоли ...


+1 к твоему очень полезному ОКР. Вероятно, это происходит из сценария миграции / обратной совместимости jquery. Есть ли шанс, что вы используете unminified / dev версию?
Марк Каплун

Unminified версия мигрировать? Нет, насколько мне известно, нет, это могут быть некоторые плагины, но после проверки я не вижу ничего из этого: \
dingo_d

1
обратите внимание, что обе версии находятся в /wp-admin/js/jquery/jquery-migrate.js/wp-admin/js/jquery/jquery-migrate.min.js
директориях

Ответы:


50

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

С выпуском WordPress 4.5 кажется, что они обновили версию jQuery, мигрировавшую с v1.2.1 до v1.4.0. Быстрая проверка кода показывает, что v1.4.0 регистрирует, что скрипт загружается независимо от того, migrateMuteопция установлена ​​и в несжатом, и в минимизированном вариантах.

Единственный способ удалить уведомление - убедиться, что все ваши плагины / код темы не зависят от какой-либо старой функциональности jQuery, а затем удалить сценарий переноса. Для этого есть плагин , но это довольно простой метод, который можно просто поместить в файл функций вашей темы или аналогичный:

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, и, по моему мнению, сценарий переноса не следует удалять только для поддержания чистоты консоли разработчика.


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

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

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

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

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

11

Вы можете изменить текст сообщения журнала на пустой, jquery-migrate.min.jsно это не будет сохранено при обновлении ядра.

Альтернативой является добавление копии функции passthrough / filter console.logнепосредственно перед загрузкой сценария переноса и указание игнорировать сообщения регистрации, содержащие ' Migrate is installed'. Выполнение этого таким образом сохранит и другие предупреждения 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();}

Результатом является одна строка HTML-скрипта, добавленная как во внешний, так и во внутренний интерфейсы, которая достигает желаемого эффекта (предотвращает установку сообщения).


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

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

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

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

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

7

Просто небольшой тест здесь.

Я заглянул в jquery-migrate.js и заметил эту часть:

// Set to true to prevent console output; migrateWarnings still maintained
// 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: Миграция установлена, версия 1.4.0

Так что на самом деле это не мешает выводу всей консоли, как эта часть в 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 );
}

1
Таким образом, нижний код просто удаляет сообщение, верно? Я имею в виду, миграция остается, но сообщение скрыто, верно? Это лучше, чем однозначно удалить миграцию
dingo_d

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

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

1

Решение:

добавьте это в 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массовым (как в админ-панели).


1

Если бы та же проблема, и узнал , что вы просто нужно установить , SCRIPT_DEBUGчтобы falseв вашей wp-config.php. Надеюсь, это поможет кому-то


2
Это не сработало для меня.
Серж Саган

-1

Как уже упоминалось ранее, Энди WordPress использует скрипт миграции jQuery для обеспечения обратной совместимости, и поэтому он автоматически загружается по умолчанию.

Вот безопасный способ удалить модуль JQuery Migrate и, таким образом, избавиться от надоедливого уведомления JQMIGRATE, ускоряя загрузку вашей страницы на стороне клиента. Просто скопируйте / вставьте этот код в файл functions.php, и все готово:

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


Подробнее

Чтобы узнать больше о причине использования статической функции, прочитайте мою статью здесь:
►► https://en.guydumais.digital/disable-jquery-migrate-in-wordpress/


2
понижен, потому что 1. это пахнет слишком много спама и просто делает минимальное усилие, чтобы чувствовать себя как ответ. 2. Вы жестко программируете версию, сводящую на нет очистку кеша.
Марк Каплун

это позор, потому что это хороший подход, даже если вы используете, add_filterкогда это на самом деле действие.
pcarvalho
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.