Дратівливий “JQMIGRATE: Міграція є…” в консолі після оновлення до WordPress 4.5


53

Чому постійне повідомлення,

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

що вказує на load-scripts.phpмою консоль, коли я оновив свою тему до WordPress 4.5, і як її можна видалити?

Це не помилка, але вона завжди присутня в моїй консолі, і я дійсно не бачу, в чому сенс. Потрібно щось оновити або внести зміни в код?

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


+1 вашому дуже корисному OCD. Можливо, це походить із сценарію сумісності / зворотної сумісності jquery. Будь-який шанс використати немініфіковану / розроблену версію?
Марк Каплун

Немініфікована версія міграції? Наскільки мені не відомо, це можуть бути плагіни, але після перевірки я нічого не бачу: \
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але це не збережеться в основному оновлення.

Альтернативою є додавання копії функції проходження / фільтрування console.logбезпосередньо перед завантаженням сценарію міграції та наказати ігнорувати повідомлення журналу, що містять ' Migrate is installed'. Це зробити таким чином, збереже й інші попередження щодо міграції:

// 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 або є "офіційно" застарілою. зворотна сумісність - це профілактика і краще, ніж ліки, коли мова йде про як справи, так і програмне забезпечення взагалі.
majick

2
Ви маєте рацію, але не підтримуючи останню версію jquery - це помилка IMO. 4.5 увійшов до RC близько місяця тому, і якщо код не був перевірений на роботу зі всіма внесеними змінами, то тема / плагін не справді сумісні. У світі поза депресаційними повідомленнями Wordpress перетворюються на фактичну депресію в якийсь момент, і ви не хочете залишати обробку ними часу, коли вам доведеться оновити якнайшвидше. ІМО мігрантів має бути тимчасовим рішенням, а не постійною ознакою.
Марк Каплун

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: Міграція встановлена ​​з активованим журналом, версія 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.
majick

2
Дякуємо за дослідження та деталі! ІМО найкращий варіант, оскільки видалення JQmigrate не завжди є гарною ідеєю, оскільки багато плагінів WP залежать від застарілих функцій jQuery. Це рішення допомагає трохи очистити вихід консолі!
Філіпп

1

Рішення:

додайте це до function.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
Це для мене не вийшло.
Serj Sagan

-1

Як вже згадувалося раніше, Енді WordPress використовує сценарій міграції jQuery для забезпечення зворотної сумісності, і тому автоматично завантажується за замовчуванням.

Ось безпечний спосіб видалити модуль JQuery Migrate і таким чином позбутися набридливого повідомлення JQMIGRATE, прискоривши завантаження вашої сторінки на стороні клієнта. Просто скопіюйте та вставте цей код у файл function.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.