Enqueue lõi jQuery trong phần chân trang?


22

Tôi có cái này trong functions.phptệp của mình và tôi không thể tải jQuery ở chân trang. Các includestập tin tải trong chân trang tốt, mặc dù. Tôi cần làm gì khác?

function starter_scripts() {
    wp_enqueue_style( 'starter-style', get_stylesheet_uri() );

    wp_enqueue_script( 'jquery', '', '', '', true );

    wp_enqueue_script( 'includes', get_template_directory_uri() . '/js/min/includes.min.js', '', '', true );
}
add_action( 'wp_enqueue_scripts', 'starter_scripts' );

Nếu bạn đang làm điều này vì lý do hiệu suất, deferthay vào đó , bạn có thể xem xét thêm vào thẻ script của mình: matthewhorne.me/defer-async-wordpress-scripts
diachedelic

WP dev ở đây, tôi đã tạo một plugin để đối phó với điều này: wordpress.org/plugins/jquery-manager
Remzi Cavdar

Câu trả lời:


23

Để làm điều đó, trước tiên bạn sẽ phải hủy đăng ký tập lệnh jQuery của bạn và sau đó đăng ký lại. Nếu bạn sử dụng jQuery đi kèm với WordPress thì sau đây là chức năng bạn đang tìm kiếm.

function starter_scripts() {
    wp_deregister_script( 'jquery' );
    wp_register_script( 'jquery', includes_url( '/js/jquery/jquery.js' ), false, NULL, true );
    wp_enqueue_script( 'jquery' );

    wp_enqueue_style( 'starter-style', get_stylesheet_uri() );
    wp_enqueue_script( 'includes', get_template_directory_uri() . '/js/min/includes.min.js', '', '', true );
}
add_action( 'wp_enqueue_scripts', 'starter_scripts' );

Nếu bạn sử dụng Google CDN phiên bản lưu trữ của jQuery thì hãy cho tôi biết tôi sẽ sửa đổi mã này cho URL Google CDN.


5
Ý anh là gì? Giải pháp là về việc chuyển jQuery sang chân trang.
Robert hue

2
Bạn cũng có thể cần kiểm tra is_admin () để tránh thực hiện các thay đổi đối với jQuery phụ trợ, sau tất cả chúng ta chỉ thực sự cần tối ưu hóa giao diện của các trang web của mình :)
Tim Malone

1
@TimMopol - thực ra, bạn không - wp_enqueue_scriptschỉ được sử dụng ở mặt trước trong khi admin_enqueue_scriptsđược sử dụng cho mặt sau
dev_masta

1
Tôi nghĩ rằng giải pháp này thực sự khủng khiếp. Là các thẻ phiên bản được loại bỏ với điều này. Kiểu khởi động này là gì và nó bao gồm.min.js và nó có liên quan gì với jQuery.
NextGenTheme

2
@redanimalwar kiểu khởi động và bao gồm các tệp được lấy trực tiếp từ câu hỏi.
tehlivi

43

Đây là một tùy chọn khác để tránh phải đăng ký lại và đăng ký lại:

/**
 * Move jQuery to the footer. 
 */
function wpse_173601_enqueue_scripts() {
    wp_scripts()->add_data( 'jquery', 'group', 1 );
    wp_scripts()->add_data( 'jquery-core', 'group', 1 );
    wp_scripts()->add_data( 'jquery-migrate', 'group', 1 );
}
add_action( 'wp_enqueue_scripts', 'wpse_173601_enqueue_scripts' );

Giải pháp này bắt chước lõi WordPress bằng cách đặt groupthành 1, đó là cách WordPress xác định liệu tập lệnh có nên ở chân trang hay không (Tôi không biết lý do 1, vì @jgraup lưu ý trong các nhận xét có vẻ hơi tùy tiện).


1
Hấp dẫn. Có vẻ như wp_register_scriptsử dụng add_data( $handle, 'group', 1 )để di chuyển các kịch bản vào phần chân trang. core.trac.wordpress.org/browser/tags/4.5/src/wp-includes/ đá - Bạn có thể mở rộng lý do tại sao không? Liếc nhìn mã của bạn, 'nhóm' có vẻ hơi độc đoán. Nhưng tôi có thể thấy trong core.trac.wordpress.org/browser/tags/4.5/src/wp-includes/ tên như thế nào nó được sử dụng trong WP_Scripts-> do_itemsau này. Dù bằng cách nào, đây dường như là câu trả lời ít phá hủy nhất.
jgraup

2
Tôi hy vọng ai đó có thể bình luận thêm về ba câu trả lời nâng cao này. Tất cả đều khác nhau và đòi hỏi một số kiến ​​thức về WP. Bởi vì google yêu cầu các tập lệnh này nằm dưới màn hình đầu tiên, đây là một chủ đề quan trọng.
ssaltman

2
Câu trả lời tốt nhất! Lưu ý : nó hoạt động kể từ WordPress 4.2.0 và sử dụng nó trong hàm.php trong cuộc gọi lại 'wp_enqueue_scripts'
realmag777

Xin chào, tôi đã thử cách tiếp cận trên, nhưng nó không hiệu quả. Có ai giúp được không?
iSaumya

1
Thật tuyệt! Cảm ơn bạn rất nhiều. Nhưng, đáng chú ý là như @tehlivi tuyên bố - WP sử dụng một phiên bản cũ của jQuery - xem xét việc hủy đăng ký và đăng ký phiên bản mới hơn.
skolind

18

Một giải pháp tốt hơn:

add_action( 'wp_default_scripts', 'move_jquery_into_footer' );

function move_jquery_into_footer( $wp_scripts ) {

    if( is_admin() ) {
        return;
    }

    $wp_scripts->add_data( 'jquery', 'group', 1 );
    $wp_scripts->add_data( 'jquery-core', 'group', 1 );
    $wp_scripts->add_data( 'jquery-migrate', 'group', 1 );
}

Tại sao nó tốt hơn thì câu trả lời được chấp nhận IMO

  1. Thay đổi nó ở cốt lõi không phải ở giai đoạn sau, nơi những thứ khác có thể đã bị rối tung với nó.
  2. Chuỗi phiên bản nó giữ đúng vị trí và không bị xóa!
  3. Nó không hủy đăng ký và đăng ký lại một tập lệnh mà nó chỉ đặt giá trị nhóm về cơ bản giống như tập lệnh sẽ được đăng ký $footer = true.

Về việc không làm điều này với quản trị viên

Nếu các plugin thêm jquery nội tuyến vào wp_head thì nó sẽ thất bại khi jquery không được tải vào thời điểm đó, vì vậy tôi khuyên bạn nên tránh điều đó cho đến khi bạn có hàng triệu chỉnh sửa trang web của mình và bạn cố gắng tối ưu hóa hiệu suất quản trị viên của mình. Điều này cũng đúng cho frontend, vì vậy bạn nên coi chừng các chủ đề hoặc plugin bị mã hóa xấu giả định jquery trong đầu bằng cách sử dụng mã jQuery nội tuyến. WP và plugin đăng ký các tập lệnh khác vào đầu quản trị viên với jquery trong deps vì vậy dù sao nó cũng không hoạt động.

Về nó không hoạt động

Bạn cần lưu ý rằng nếu bất kỳ tập lệnh nào khác được tải vào phần đầu có jQuery trong phần phụ thuộc của nó, thì nó cũng sẽ khiến jQuery tải vào phần đầu ngay trước chính nó. Và điều này là tốt và được mong đợi, lý do hệ thống wp_enqueue tồn tại. Điều này có nghĩa là bạn sẽ học sớm nếu bạn sử dụng một vài plugin mà một trong số chúng sẽ yêu cầu gây ra sự ghen tị. Nó là mặc định cho các kịch bản mê hoặc, đáng buồn.

Giải pháp cấp tiến

Tôi nghĩ rằng nó sẽ hãm bất kỳ JS nội tuyến nào giả định jquery nhưng điều đó sẽ hiếm khi xảy ra. Điều này sẽ buộc tất cả các tập lệnh đến chân trang bất kể chúng được xử lý như thế nào.

add_action( 'wp_enqueue_scripts', 'js_to_footer' );

function js_to_footer() {
  remove_action( 'wp_head', 'wp_print_scripts' );
  remove_action( 'wp_head', 'wp_print_head_scripts', 9 );
  remove_action( 'wp_head', 'wp_enqueue_scripts', 1 );
}

2
Trong khi điều này có thể trả lời câu hỏi và có một số điểm tốt để nhai vì có quá nhiều tiếng ồn (fluff?) Trong câu trả lời và rất giống với các câu trả lời được đăng trước đó với các cải tiến mã nhỏ. Nó có thể được đón nhận nhiều hơn nếu nó được chỉnh sửa và thu gọn thành một phiên bản nhiều thông tin hơn. Cũng không có nhu cầu thực sự để gọi ra người dùng hoặc câu trả lời cụ thể (vì chúng có thể không tồn tại vì bất kỳ lý do gì trong tương lai).
Howdy_McGee

Bạn gọi một cách hoàn toàn không đề cập và có lẽ tốt hơn sau đó bất cứ điều gì được đề cập trong các câu trả lời khác là "cải tiến mã nhỏ". Vâng, đó đơn giản là không đúng sự thật. Ngoài ra tôi không "kêu gọi" bất cứ ai, tôi chỉ đề cập đến những sự thật mà tôi biết để cải thiện phong cách mã hóa và giáo dục người đọc về nó để làm cho họ viết mã tốt hơn. Nghiêm túc mà nói, tôi đã mất khá nhiều thời gian để viết câu trả lời tốt nhất ở đây cho đến nay và đây là những gì tôi nhận được cho nó.
NextGenTheme

4
Các câu trả lời khác không đề cập gì đến các tập lệnh khác buộc jQuery lên đầu, thực tế câu trả lời của tôi làm mất đi sự nhầm lẫn với những người không biết tại sao nó không hoạt động. Không có câu trả lời nào khác đề cập đến những rủi ro tiềm ẩn ...
NextGenTheme

Mã này (như mã của câu trả lời ở trên) trả lại cho tôi một lỗi 500. Tôi có WordPress 4.9.9
Marco Panichi

Khó có thể tin rằng mã này đang gây ra 500, có lẽ bạn đã phạm sai lầm khi triển khai mã này trong mã của mình. Đây không thực sự là nơi thích hợp để hỏi và phiên bản WP lỗi thời của bạn hầu như không đủ thông tin.
NextGenTheme

2

Tôi đã phát triển một plugin cho vấn đề cụ thể này. Plugin này 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ả phiên bản nén / sản xuất nén và phiên bản không nén / phát triển. Xem các tính năng dưới đây!

Chỉ được thực hiện ở mặt trước, 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/f84ab5e19f0038a3abec71821c9b8f47a4272942/wp-includes/script-loader.php#L1017

// jQuery
$scripts->add( 'jquery', false, array( 'jquery-core', 'jquery-migrate' ), '1.12.4-wp' );
$scripts->add( 'jquery-core', '/wp-includes/js/jquery/jquery.js', array(), '1.12.4-wp' );
$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 );

0
add_action("wp_enqueue_scripts", "myscripts");

function myscripts() { 
   wp_enqueue_script( 'jquery' , '', array(), true); //true for footer
   wp_enqueue_script( 'someScript-js', 'https://domain.com/someScript.js' , '', '', true );
}

-3

Hey chỉ thay đổi mã của bạn để thích điều này

function starter_scripts() {
        wp_enqueue_style( 'starter-style', get_stylesheet_uri() );
        wp_enqueue_script('jquery');
        wp_enqueue_script( 'includes', get_template_directory_uri() . '/js/min/includes.min.js', array( 'jquery' ) );
    }
    add_action( 'wp_enqueue_scripts', 'starter_scripts' );

tôi nghĩ nó hoạt động tốt

thêm dòng này vào tập tin tests.php của bạn

remove_action('wp_head', 'wp_enqueue_scripts', 1);
add_action('wp_footer', 'wp_enqueue_scripts', 5);

sau đó nó thêm script vào phần chân trang


Điều này đặt jQuery vào đầu. Tôi cần nó ở phần chân trang.
Desi

Này Desi vui lòng kiểm tra câu trả lời đã được chỉnh sửa Tôi nghĩ nó giúp bạn
Amit Mishra

6
Tôi khá chắc chắn rằng đây là một ý tưởng tồi tệ - bạn đã ngăn chặn hiệu quả mọi thứ từ việc tải tập lệnh trong tiêu đề, không chỉ jQuery và có thể là các tập lệnh hấp dẫn kép (nhìn không sâu sắc). Trong thực tế, có lẽ bạn chỉ cần remove_action/ add_actionphần nếu bạn sẽ làm theo cách này.
drzaus

1
Thực sự ý tưởng khủng khiếp, đừng làm điều này!
NextGenTheme
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.