Làm phiền JQMIGRATE: Di chuyển là phạm lỗi trong bảng điều khiển sau khi cập nhật lên WordPress 4.5


53

Tại sao có một thông báo liên tục,

JQMIGRATE: Di chuyển được cài đặt, phiên bản 1.4.0

chỉ đến load-scripts.phptrong bảng điều khiển của tôi khi tôi cập nhật chủ đề của mình lên WordPress 4.5 và làm cách nào để xóa nó?

Đó không phải là một lỗi, nhưng nó luôn xuất hiện trong bảng điều khiển của tôi và tôi thực sự không thấy ý nghĩa của nó. Tôi nên cập nhật một cái gì đó, hoặc thực hiện một số thay đổi cho mã của tôi?

Có thể tôi có một chút OCD, nhưng thông thường khi tôi kiểm tra trang web, tôi muốn thấy các lỗi và thông báo thực sự chỉ ra một vấn đề trong bảng điều khiển của tôi ...


+1 cho OCD rất hữu ích của bạn. Điều này có lẽ đến từ tập lệnh tương thích ngược / ngược jquery. Bất kỳ cơ hội bạn sử dụng phiên bản chưa hoàn thành / dev của nó?
Đánh dấu Kaplun

Phiên bản chưa hoàn thành của di chuyển? Theo hiểu biết của tôi thì không, đó có thể là một số plugin, nhưng khi kiểm tra tôi không thấy bất kỳ plugin nào: \
dingo_d

1
lưu ý cả hai phiên bản đều có trong thư mục WP: /wp-admin/js/jquery/jquery-migrate.js/wp-admin/js/jquery/jquery-migrate.min.js
majick

Câu trả lời:


50

WordPress sử dụng tập lệnh di chuyển jQuery để đảm bảo khả năng tương thích ngược cho mọi plugin hoặc chủ đề bạn có thể đang sử dụng, sử dụng chức năng được loại bỏ khỏi các phiên bản jQuery mới hơn.

Với việc phát hành WordPress 4.5, có vẻ như họ đã nâng cấp phiên bản jQuery di chuyển từ v1.2.1 lên v1.4.0 - Việc quét nhanh qua mã cho thấy bản ghi v1.4.0 mà tập lệnh được tải bất kể có hay không migrateMutetùy chọn được đặt và trong cả phiên bản không nén và rút gọn.

Cách duy nhất để xóa thông báo là đảm bảo tất cả các plugin / mã chủ đề của bạn không dựa vào bất kỳ chức năng jQuery cũ nào và sau đó xóa tập lệnh di chuyển. Có một plugin ngoài đó để làm điều này, nhưng đó là một phương pháp khá đơn giản chỉ có thể được đặt trong tệp chức năng của chủ đề hoặc tương tự:

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

Xin lưu ý rằng đây không được coi là thực tiễn tốt nhất để phát triển WordPress và theo tôi, không nên xóa tập lệnh di chuyển chỉ vì mục đích giữ cho bảng điều khiển dành cho nhà phát triển sạch sẽ.


Vì vậy, về cơ bản, một trong các plugin của tôi phụ thuộc vào chức năng là một phần của phiên bản jQuery cũ? Có cách nào để tìm hiểu chức năng đó là gì không? Hay tôi an toàn khi chỉ tắt tiếng tập lệnh di chuyển?
dingo_d

1
Tôi không thể chắc chắn liệu có bất kỳ plugin nào của bạn phụ thuộc vào chức năng cũ hay không, WordPress chỉ bao gồm tập lệnh di chuyển như một mặc định an toàn trong trường hợp cài đặt của bạn có bất kỳ plugin nào được cập nhật trong một thời gian. Nếu là tôi, tôi sẽ xóa tập lệnh di chuyển trên bản cài đặt cục bộ của trang web và sau đó kiểm tra mọi thứ vẫn hoạt động như mong đợi, đảm bảo không có lỗi nào trong bảng điều khiển, v.v.
Andy

Tôi đề nghị chống lại điều này. Khả năng tương thích ngược này là có lý do. Nó tương đương với jQuery khi xóa tệp chức năng không dùng nữa trong WordPress. Đi đến tất cả các vấn đề về việc xác minh xem thiết lập hiện tại của bạn có tương thích hoàn toàn hay không thậm chí không tính đến các thay đổi của cài đặt hoặc bổ sung plugin và đưa ra các vấn đề tiềm ẩn mà bạn đang tạo không cân bằng với lợi ích hoàn toàn đáng ngờ của việc xóa thông báo nhật ký bảng điều khiển .
Majick

1
@majick Nó nằm ngoài phạm vi của câu trả lời này để thảo luận về việc loại bỏ tập lệnh có phải là một ý tưởng tốt hay không, điều này đặc biệt giải quyết vấn đề làm thế nào để loại bỏ tin nhắn trong bảng điều khiển. FWIW, tôi nghĩ loại bỏ kịch bản cũng là một ý tưởng tồi. Tôi nghĩ rằng downvote không bị cản trở, vì câu trả lời của tôi trả lời hoàn hảo câu hỏi của OP.
Andy

1
xin lỗi tôi không downvote thường xuyên, nhưng cảm thấy cần thiết ở đây vì không có cảnh báo nào rằng đây có thể không phải là ý tưởng hay và ngược lại với thực tiễn tốt nhất trong phát triển (thêm cảnh báo và tôi sẽ xóa downvote.) Tôi tin rằng câu hỏi là làm thế nào để loại bỏ chỉ thông điệp giao diện điều khiển chứ không phải làm thế nào để loại bỏ jquery di chuyển chính nó. nếu ai đó hỏi làm thế nào để xóa thông báo cập nhật trong WordPress, bạn sẽ không trả lời "chỉ cần gỡ cài đặt WordPress."
Majick

11

Bạn có thể thay đổi văn bản thông điệp tường trình thành trống jquery-migrate.min.jsnhưng điều này sẽ không được giữ lại trong bản cập nhật cốt lõi.

Cách khác là thêm bản sao chức năng passth thông qua / bộ lọc console.logvào ngay trước khi tập lệnh di chuyển được tải và bảo nó bỏ qua các thông điệp ghi nhật ký có chứa ' Migrate is installed'. Làm theo cách này cũng sẽ bảo vệ các cảnh báo Di chuyển khác:

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

Kết quả là một dòng tập lệnh HTML được thêm vào cả giao diện và phụ trợ để đạt được hiệu ứng mong muốn (ngăn chặn thông báo đã cài đặt.)


1
+1 cho ý tưởng, nhưng nếu đó là trang web của bạn, có lẽ tốt hơn là chỉ cần đảm bảo tất cả các tập lệnh của bạn tương thích với phiên bản mới nhất và xóa trình di chuyển;)
Mark Kaplun

có, nhưng tôi hoàn toàn không đồng ý với việc loại bỏ trình di chuyển như một cách thực hành vì nó không tính đến việc cài đặt các chủ đề / plugin có thể không tương thích với jQuery mới nhất. vì song song, có rất nhiều plugin vẫn hoạt động tốt mặc dù chúng có thể không nhận ra chức năng WordPress ở đây hoặc "không chính thức" bị phản đối. khả năng tương thích ngược là phòng ngừa và tốt hơn là chữa bệnh khi nói đến cả hai trường hợp và phần mềm nói chung.
Majick

2
Bạn nói đúng, nhưng không hỗ trợ phiên bản jquery mới nhất là lỗi IMO. 4.5 đã đi vào RC khoảng một tháng trước và nếu mã không được thử nghiệm để hoạt động với tất cả các thay đổi mà nó đã giới thiệu, thì chủ đề / plugin không thực sự tương thích. Trong thế giới bên ngoài các thông báo khấu hao wordpress biến thành sự phản đối thực tế tại một số điểm và bạn không muốn rời khỏi việc xử lý chúng đến thời điểm bạn phải nâng cấp ASAP. IMO di chuyển phải là một giải pháp tạm thời, không phải là một tính năng vĩnh viễn.
Đánh dấu Kaplun

2
Tôi không đồng ý với các hiệu trưởng ở đây, internet là một mục tiêu di chuyển nhanh và cảnh quan đang thay đổi mọi lúc. (vào thời điểm cần thiết để đưa tính năng logo của trang web lên 4,5 chẳng hạn, các trang web đã chuyển từ ý tưởng chỉ có một logo). Cũ chỉ tốt khi được áp dụng cho các hốc rất cụ thể và ổn định, nhưng ví dụ jQuery được biết là một mục tiêu tương đối di chuyển.
Đánh dấu Kaplun

1
Một chủ đề không phải là một sản phẩm bị cô lập. Nếu một chủ đề là bao bì wordpress và jquery, vv, thì tuổi của chủ đề sẽ hoàn toàn phù hợp. Vì không có chủ đề nào làm điều đó, nếu chủ đề không được kiểm tra đối với phiên bản wordpress đang được sử dụng, thì không rõ loại lỗi nào sẽ được phát hiện. Đây chỉ là một biểu hiện khác của tình huống khó xử liên kết tĩnh và động. Trong một thế giới liên kết tĩnh, yêu cầu của bạn chủ yếu là đúng, nhưng wordpress là liên kết động và chỉ vì một cái gì đó đã hoạt động với 3.5 không có nghĩa là nó sẽ hoạt động với 4.5 ngay cả khi cố gắng tương thích ngược
Mark Kaplun

7

Chỉ cần một thử nghiệm nhỏ ở đây.

Tôi đã xem lén jquery-Migrate.js và nhận thấy phần này:

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

Vì vậy, tôi đã thử nghiệm những điều sau đây với wp_add_inline_script()phiên bản mới , được giới thiệu trong phiên bản 4.5:

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

Điều này sẽ thay đổi:

JQMIGRATE: Di chuyển được cài đặt với hoạt động đăng nhập, phiên bản 1.4.0

đến:

JQMIGRATE: Di chuyển được cài đặt, phiên bản 1.4.0

Vì vậy, nó không thực sự ngăn chặn tất cả đầu ra của giao diện điều khiển, như phần này trong 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
Vì vậy, mã dưới cùng chỉ cần loại bỏ tin nhắn, phải không? Ý tôi là, việc di chuyển ở lại nhưng tin nhắn thì bị đè nén, phải không? Điều này tốt hơn là xóa di chuyển một cách chắc chắn
dingo_d

1
không có, đó là một bản sao của mã sản xuất nội dung log console mà không ra. nó cho thấy MigrateMute chỉ được thử nghiệm cho nửa sau của thông báo bảng điều khiển - nửa đầu là đầu ra bất kể ... xóa khối mã này sẽ xóa thông báo bảng điều khiển, nhưng bạn sẽ cần làm lại mỗi bản cập nhật WP.
Majick

2
Cảm ơn các nghiên cứu và chi tiết! IMO là tùy chọn tốt nhất, vì loại bỏ JQmigrate không phải lúc nào cũng là một ý tưởng hay, bởi vì nhiều plugin WP phụ thuộc vào các hàm jQuery không dùng nữa. Giải pháp này giúp dọn sạch đầu ra giao diện điều khiển một chút!
Philipp

1

Giải pháp:

thêm phần này vào hàm.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 );

Nó hoạt động khi jquery-migrateđược gọi với hook tiêu chuẩn (đầu ra <link rel=stylesheet....>) và không phải với load-scripts.phpsố lượng lớn (như trong bảng điều khiển quản trị).


1

Có cùng một vấn đề, và phát hiện ra bạn chỉ cần thiết lập SCRIPT_DEBUGđể falsetại của bạn wp-config.php. Hy vọng điều này sẽ giúp ai đó


2
Điều đó đã không làm việc cho tôi.
Serj Sagan

-1

Như Andy WordPress đã đề cập trước đây sử dụng tập lệnh di chuyển jQuery để đảm bảo khả năng tương thích ngược và đây là lý do tại sao nó được tự động tải theo mặc định.

Đây là một cách an toàn để loại bỏ mô-đun JQuery Migrate và do đó loại bỏ thông báo JQMIGRATE gây phiền nhiễu trong khi tăng tốc độ tải trang của bạn ở phía máy khách. Đơn giản chỉ cần sao chép / dán mã này trong functions.php tập tin và bạn đã hoàn tất:

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


Thêm chi tiết

Để biết thêm chi tiết về lý do tôi sử dụng hàm tĩnh, hãy đọc bài viết của tôi ở đây:
► ► https://en.guydumais.digital/disable-jquery-migrate-in-wordpress/


2
bị hạ thấp bởi vì 1. điều này có mùi quá nhiều của một thư rác và chỉ cần nỗ lực tối thiểu để cảm thấy như một câu trả lời. 2. Bạn cứng mã phiên bản vô hiệu hóa bộ đệm cache.
Mark Kaplun

thật xấu hổ vì đó là một cách tiếp cận hay, thậm chí bạn đang sử dụng add_filterkhi nó thực sự là một hành động.
pcarvalho
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.