Cập nhật phiên bản jquery


24

Tôi chạy phiên bản WordPress 4.7.2. và nó sử dụng jQuery phiên bản 1.12. Tôi cần cập nhật phiên bản này lên phiên bản cao hơn. Tôi đã thay thế nó bằng một phiên bản mới trước đây, nhưng khi tôi nâng cấp lõi WordPress thì nó lại được thay thế bằng 1.12. Làm cách nào để thay đổi phiên bản jQuery mà WordPress sử dụng vĩnh viễn?

Câu trả lời:


29

Cảnh báo: Bạn không nên thay thế phiên bản jQuery lõi, đặc biệt là trong bảng quản trị . Vì nhiều chức năng cốt lõi của WordPress có thể phụ thuộc vào phiên bản. Ngoài ra, các plugin khác có thể phụ thuộc vàojQueryphiên bản được thêm vào lõi.

Nếu bạn chắc chắn rằng bạn muốn thay đổi jQueryphiên bản cốt lõi , trong trường hợp đó, bạn có thể thêm CODE sau vào functions.phptệp của chủ đề đang hoạt động (thậm chí tốt hơn nếu bạn tạo plugin cho việc này):

function replace_core_jquery_version() {
    wp_deregister_script( 'jquery' );
    // Change the URL if you want to load a local copy of jQuery from your own server.
    wp_register_script( 'jquery', "https://code.jquery.com/jquery-3.1.1.min.js", array(), '3.1.1' );
}
add_action( 'wp_enqueue_scripts', 'replace_core_jquery_version' );

Điều này sẽ thay thế jQueryphiên bản lõi và thay vào đó tải phiên bản 3.1.1từ máy chủ của Google.

Ngoài ra, mặc dù không được khuyến nghị , bạn cũng có thể sử dụng dòng CODE bổ sung sau để thay thế phiên bản jQuery wp-admin:

add_action( 'admin_enqueue_scripts', 'replace_core_jquery_version' );

Bằng cách này, ngay cả sau khi cập nhật WordPress, bạn sẽ có phiên bản jQuerynhư bạn muốn.

Một chức năng tốt hơn một chút:

Các replace_core_jquery_versionchức năng trên cũng loại bỏ jquery-migratekịch bản bổ sung bởi WordPress lõi. Điều này là hợp lý, vì phiên bản mới nhất của jQuery sẽ không hoạt động đúng với phiên bản cũ hơn jquery-migrate. Tuy nhiên, bạn cũng có thể bao gồm một phiên bản mới hơn jquery-migrate. Trong trường hợp đó, sử dụng chức năng sau thay thế:

function replace_core_jquery_version() {
    wp_deregister_script( 'jquery-core' );
    wp_register_script( 'jquery-core', "https://code.jquery.com/jquery-3.1.1.min.js", array(), '3.1.1' );
    wp_deregister_script( 'jquery-migrate' );
    wp_register_script( 'jquery-migrate', "https://code.jquery.com/jquery-migrate-3.0.0.min.js", array(), '3.0.0' );
}

Bạn có thể loại bỏ hành động khỏi hàm.php nếu bạn thấy rằng nó phá vỡ chủ đề của bạn? Nó sẽ trở lại phiên bản jQuery gốc hay đây là một thay đổi vĩnh viễn?
Nick

1
Nếu chức năng gọi lại của wp_enqueue_scriptshành động chỉ cập nhật jQuery và jQuery đang bị mê hoặc từ một nơi khác, thì việc xóa hành động sẽ khôi phục jQuery gốc. Tuy nhiên, đôi khi trình duyệt lưu bộ đệm CODE cũ, tùy thuộc vào cài đặt bộ đệm của máy chủ, Vì vậy, bạn sẽ cần xóa bộ nhớ cache của trình duyệt sau khi bạn thực hiện việc đó để xem thay đổi.
Fayaz

ok cảm ơn tôi chỉ muốn chắc chắn rằng tôi đã không làm hỏng trang web của mình trước khi thêm hành động này. Tôi có cảm giác những gì bạn nói là chính xác nhưng tôi muốn chơi nó an toàn.
Nick

1
Điều này rõ ràng không phảivĩnh viễn , vì sự thay đổi này phụ thuộc vào chính CODE, không có gì được lưu trên cơ sở dữ liệu. Vì vậy, loại bỏ CODE liên quan sẽ trở lại trạng thái cũ.
Fayaz

Tập lệnh di chuyển cho các phiên bản 3.x không hoạt động khi các plugin / chủ đề mong đợi phiên bản dưới 1.12. Thông tin thêm về điều đó tại đây: wordpress.stackexchange.com/a/244543/75495
cjbj

5

Tôi đã phát triển một plugin cho vấn đề cụ thể này. Plugin không gây rối với WordPress jQuery vì nó chỉ được tải ở phần đầu. Xem: Trình quản lý jQuery cho WordPress

Tại sao lại là một công cụ cập nhật / quản lý / phát triển / gỡ lỗi jQuery khác?

Bởi vì không có công cụ dành cho nhà phát triển nào cho phép bạn chọn một phiên bản cụ thể của jQuery và / hoặc jQuery Migrate. Cung cấp cả sản xuất và phiên bản rút gọn. Xem các tính năng dưới đây!

Chỉ được thực hiện ở phần đầu, không can thiệp vào quản trị viên / phụ trợ WordPress và tùy biến WP (vì lý do tương thích) Xem: https://core.trac.wordpress.org/ticket/45130https: // core. trac.wordpress.org/ticket/37110

Bật / tắt jQuery và / hoặc jQuery Di chuyển

Kích hoạt một phiên bản cụ thể của jQuery và / hoặc jQuery Migrate

Và nhiều hơn nữa! Mã này là nguồn mở, vì vậy bạn có thể nghiên cứu nó, học hỏi từ nó và đóng góp.


Hầu như mọi người đều sử dụng tay cầm không chính xác

WordPress thực sự sử dụng tay cầm jquery-core chứ không phải jquery:

https://github.com/WordPress/WordPress/blob/91da29d9afaa664eb84e1261ebb916b18a362aa9/wp-includes/script-loader.php#L226

// jQuery
$scripts->add( 'jquery', false, array( 'jquery-core', 'jquery-migrate' ), '1.12.4' );
$scripts->add( 'jquery-core', '/wp-includes/js/jquery/jquery.js', array(), '1.12.4' );
$scripts->add( 'jquery-migrate', "/wp-includes/js/jquery/jquery-migrate$suffix.js", array(), '1.4.1' );

Các jquery xử lý chỉ là một bí danh để tải jquery-core với jquery-di chuyển

Xem thêm thông tin về bí danh: wp_register_script nhiều định danh?

Cách chính xác để làm điều đó

Trong ví dụ dưới đây, tôi sử dụng CDN jQuery chính thức tại https://code.jquery.com Tôi cũng sử dụng script_loader_tag để tôi có thể thêm một số thuộc tính CDN.
Bạn có thể sử dụng mã sau đây:

// Front-end not excuted in the wp admin and the wp customizer (for compatibility reasons)
// See: https://core.trac.wordpress.org/ticket/45130 and https://core.trac.wordpress.org/ticket/37110
function wp_jquery_manager_plugin_front_end_scripts() {
    $wp_admin = is_admin();
    $wp_customizer = is_customize_preview();

    // jQuery
    if ( $wp_admin || $wp_customizer ) {
        // echo 'We are in the WP Admin or in the WP Customizer';
        return;
    }
    else {
        // Deregister WP core jQuery, see https://github.com/Remzi1993/wp-jquery-manager/issues/2 and https://github.com/WordPress/WordPress/blob/91da29d9afaa664eb84e1261ebb916b18a362aa9/wp-includes/script-loader.php#L226
        wp_deregister_script( 'jquery' ); // the jquery handle is just an alias to load jquery-core with jquery-migrate
        // Deregister WP jQuery
        wp_deregister_script( 'jquery-core' );
        // Deregister WP jQuery Migrate
        wp_deregister_script( 'jquery-migrate' );

        // Register jQuery in the head
        wp_register_script( 'jquery-core', 'https://code.jquery.com/jquery-3.3.1.min.js', array(), null, false );

        /**
         * Register jquery using jquery-core as a dependency, so other scripts could use the jquery handle
         * see /wordpress/283828/wp-register-script-multiple-identifiers
         * We first register the script and afther that we enqueue it, see why:
         * /wordpress/82490/when-should-i-use-wp-register-script-with-wp-enqueue-script-vs-just-wp-enque
         * /programming/39653993/what-is-diffrence-between-wp-enqueue-script-and-wp-register-script
         */
        wp_register_script( 'jquery', false, array( 'jquery-core' ), null, false );
        wp_enqueue_script( 'jquery' );
    }
}
add_action( 'wp_enqueue_scripts', 'wp_jquery_manager_plugin_front_end_scripts' );


function add_jquery_attributes( $tag, $handle ) {
    if ( 'jquery-core' === $handle ) {
        return str_replace( "type='text/javascript'", "type='text/javascript' integrity='sha256-FgpCb/KJQlLNfOu91ta32o/NMZxltwRo8QtmkMRdAu8=' crossorigin='anonymous'", $tag );
    }
    return $tag;
}
add_filter( 'script_loader_tag', 'add_jquery_attributes', 10, 2 );
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.