Khi nào nên sử dụng add_action ('init') so với add_action ('wp_enqueue_scripts')


10

Trong hàm.php của chủ đề của tôi, tôi đang gọi add_action để có được số đo kiểm soát nơi tải jquery (ở chân trang cùng với các tập lệnh khác của chủ đề của tôi).

Vấn đề tôi gặp phải là khi tôi sử dụng add_action ('wp_enqueue_scripts'), nó chỉ xuất hiện để kích hoạt nếu không có plugin nào được tải. Tuy nhiên, phương thức add_action ('init') hoạt động trong mọi trường hợp.

Tôi không thể nhớ tại sao, nhưng tôi tin rằng add_action ('wp_enqueue_scripts') được ưu tiên trong trường hợp này. Nếu đó là sự thật, làm thế nào tôi có thể làm cho nó hoạt động trong mọi trường hợp?

Trong hàm.php

//if(!is_admin()){add_action('init', 'my_theme_init');} //THIS WORKS ALL THE TIME
//add_action('wp_enqueue_scripts', 'my_theme_init'); //THIS ONLY WORKS WHEN NO PLUGINS PRESENT

if(!is_admin())
{
    require_once(TEMPLATEPATH . '/functions_public.php');   
}

Trong Hàm_public.php

function my_theme_init()
{

/* PREVENT DUPLICATE COPIES OF JQUERY FROM PLUGINS
**************************************************/
wp_deregister_script('jquery');

/* LOAD THE LOCAL WORDPRESS COPY OF JQUERY AND THEME CUSTOM SCRIPTS IN THE FOOTER
***********************************************/
wp_register_script('jquery', get_bloginfo('template_directory').'/scripts.mythemescripts.js',false,false,true);

wp_enqueue_script('jquery');

}

Phương thức thứ 2, sử dụng add_action ('wp_enqueue_scripts') dường như không được thực thi trong điều kiện có plugin bổ sung ghi ra các phụ thuộc tập lệnh vào chủ đề.


5
Vui lòng không đăng ký bản sao của jquery của riêng bạn - sử dụng phiên bản được gửi cùng với WordPress, nếu không bạn sẽ phá vỡ các plugin :)
Stephen Harris

Tôi đồng ý, thực sự tôi đang sử dụng một giao hàng với jQuery. Tôi chỉ đang tải nó vào một .js (huyền thoại mô tả) cùng với các tệp js khác mà chủ đề của tôi cần, để giảm yêu cầu http.
N2Mystic

Trong tất cả các trình duyệt, một khi tập lệnh được yêu cầu từ trang web của bạn một lần, nó sẽ được lưu trữ cục bộ. Bạn sẽ chỉ có thêm yêu cầu HTTP khi tải trang đầu tiên. Nếu bạn kết hợp tất cả các tập lệnh thành một tập lệnh duy nhất, bạn sẽ buộc phải thay đổi điều này mỗi khi WP phát hành bản cập nhật với phiên bản jQuery mới. Điều này == cơn ác mộng bảo trì.
EAMann

2
@EAMann, khi chủ đề được cài đặt lần đầu tiên và mỗi lần trang tùy chọn chủ đề của tôi được lưu sau đó, tôi sẽ viết lại các trang chủ đề huyền thoại, tải bản sao mới nhất của thư viện jquery vào đó. Nếu người dùng cập nhật phiên bản WP của họ, thói quen tùy chọn chủ đề của tôi sẽ tải jquery đi kèm với điều đó. Nó luôn luôn cập nhật.
N2Mystic

Vấn đề vẫn xảy ra khi một cuộc gọi jquery được chứa trong phần thân của tài liệu trước phần chân trang. Rõ ràng jQuery (tài liệu). Đã chạy trước khi tập lệnh .js được tải vào phần chân trang.
N2Mystic

Câu trả lời:


26

Rất nhiều nhà phát triển plugin không làm mọi thứ đúng cách. Cách đúng là nối vào wp_enqueue_scriptsnhư bạn đang cố gắng làm.

Tuy nhiên, đây là thứ tự của các móc chạy trong một yêu cầu điển hình:

  • muplugins_loaded
  • đã đăng ký
  • đã đăng ký_post_type
  • plugins_loaded
  • sanitize_comment_cookies
  • setup_theme
  • load lòng miền
  • after_setup_theme
  • auth_cookie_malformed
  • auth_cookie_valid
  • set_cản_user
  • trong đó
  • widget_init
  • register_sidebar
  • wp_register_sidebar_widget
  • wp_default_scripts
  • wp_default_stypes
  • quản trị_bar_init
  • add_admin_bar_menus
  • wp_loaded
  • mệnh đề
  • người gửi
  • parse_query
  • pre_get_posts
  • bài viết
  • wp
  • template_redirect
  • get_header
  • wp_head
  • wp_enqueue_scripts
  • wp_print_ststyle
  • wp_print_scripts
  • ... hơn rất nhiều

Vấn đề là, một số nhà phát triển ban đầu được yêu cầu nối lại để initthu hút các kịch bản của họ. Quay trở lại trước khi chúng tôi gặp khó khăn wp_enqueue_script, đó là cách "chính xác" để thực hiện và các hướng dẫn duy trì hoạt động vẫn đang trôi nổi trên Internet làm hỏng các nhà phát triển giỏi.

Đề nghị của tôi sẽ là chia chức năng của bạn thành hai phần. Thực hiện wp_deregister_script/ wp_register_scripttrên inithook của bạn và sử dụng wp_enqueue_scriptshook khi bạn thực sự mê đắm jQuery.

Điều này sẽ giữ cho bạn trong thế giới "làm đúng" để xử lý các tập lệnh của bạn và sẽ giúp bảo vệ bạn khỏi hàng trăm nhà phát triển vẫn "làm sai" bằng cách hoán đổi jQuery cho phiên bản được nối của bạn trước khi họ thêm nó vào hàng đợi .

Bạn cũng sẽ muốn thêm inithook của mình với mức độ ưu tiên cao:

add_action( 'init', 'swap_out_jquery', 1 );
function swap_out_jquery() {
    // ...
}

2
Tôi sẽ đề xuất điều này, nhưng sau đó tôi nhận ra rằng OP thực sự đang hủy đăng ký jQuery và sau đó đăng ký hoàn toàn một tập lệnh khác và gọi nó là "jquery". Tôi không nghĩ rằng đó là một cách thực hành tốt để khuyến khích và nghĩ rằng một tuyến đường tốt hơn sẽ chỉ đơn giản là xử lý hoàn toàn jQuery , và sau đó xử lý tập lệnh tùy chỉnh bằng cách sử dụng một điều khiển tùy chỉnh .
Chip Bennett

Điểm cần lưu ý về priorityviệc thêm hành động. Tất cả phụ thuộc vào cách bạn xem ưu tiên. Nếu bạn muốn của bạn chạy "đầu tiên", thì số thấp hơn sẽ tốt hơn - mức độ ưu tiên cao hơn trong thứ tự hàng đợi thực hiện. Nhưng nếu bạn muốn hiệu ứng của chức năng của bạn được ưu tiên hơn những người khác, bạn sẽ muốn nó chạy sau - vì vậy, mức độ ưu tiên cao hơn là "hiệu ứng". Và trong trường hợp này, nó có thể là một con số cao hơn mà bạn muốn. Mặc dù có rất ít công đức trong việc hoán đổi phiên bản RTM của jquery, như các bình luận trước đây cho thấy.
Paul G.

3

Có nhiều vấn đề ở đây, có liên quan đến nhau.

  1. Móc hành động chính xác để sử dụng để enqueue script là wp_enqueue_scripts
  2. Để in tập lệnh ở chân trang qua wp_enqueue_script(), đặt $footertham số thànhtrue
  3. Cuộc add_action( $hook, $callback )gọi của bạn không nên được bọc trong bất cứ điều gì; để họ thực hiện trực tiếp từfunctions.php
  4. Bạn nên đặt is_admin()kiểm tra có điều kiện trong cuộc gọi lại của bạn
  5. Vì bất kỳ lý do gì, bạn không nên hủy bỏ các tập lệnh đóng gói lõi từ Chủ đề. Ngay cả khi mục đích của bạn là ghép tập lệnh, đó là lãnh thổ Plugin .
  6. Nếu bạn phải xoá đăng ký jquery, sau đó wp_enqueue_scriptsquá muộn . Tách mã đăng ký / đăng ký của bạn thành một cuộc gọi lại được nối vào init.
  7. Gọi một số kịch bản khác là "jquery" có lẽ không phải là một thực hành tốt. Đặt cược tốt hơn của bạn chỉ đơn giản là dequeue jQuery và sau đó tải tập lệnh tùy chỉnh của bạn.
  8. Hãy chắc chắn đặt mức độ ưu tiên thấp cho cuộc gọi lại của bạn, để bạn ghi đè lên Plugin
  9. Sử dụng get_template_directory()chứ không phảiTEMPLATEPATH

Để tất cả chúng cùng nhau:

<?php
function wpse55924_enqueue_scripts() {
    if ( ! is_admin() ) {

        // Dequeue jQuery
        wp_dequeue_script( 'jquery' );

        // Register/enqueue a custom script, that includes jQuery
        wp_register_script( 'mythemescripts', get_template_directory_uri() . '/scripts.mythemescripts.js', false, false,true );
        wp_enqueue_script( 'mythemescripts' ); 
    }
}
add_action( 'wp_enqueue_scripts', 'wpse55924_enqueue_scripts', 99 );

Nhưng một lần nữa: đây thực sự không phải là cách tiếp cận tốt nhất. Đặt cược tốt hơn của bạn chỉ đơn giản là loại bỏ các cuộc gọi lại plugin add_action () mà hủy đăng ký lõi jQuery - hoặc sử dụng các Trình cắm không làm điều gì đó quá liều lĩnh như thay thế jQuery được gói lõi.


OP đang kết hợp phiên bản jQuery phân phối WP với một số tập lệnh khác theo chương trình để chỉ một yêu cầu HTTP được tạo bởi chủ đề của anh ấy để tải tất cả các tệp JS. Vì vậy, các tập lệnh tùy chỉnh không chứa jQuery và sẽ không phá vỡ bất cứ thứ gì nếu được tải theo cách này. Ghi đè xử lý 'jquery' đã đăng ký là cần thiết để ngăn tải jQuery hai lần - một lần trong tệp JS kết hợp và một lần nữa bởi bất kỳ plugin nào cố gắng tự mình xử lý jQuery.
EAMann

Đó là về mặt ngữ nghĩa và thực tế _doing_it_wrong()để gọi một cái gì đó không chỉ là "jQuery". Ngoài ra: jQuery riêng của mình chỉ đơn giản có thể được dequeued để đảm bảo rằng nó không được nạp hai lần. Cuộc wp_dequeue_script()gọi chỉ cần diễn ra với mức độ ưu tiên đủ để đảm bảo rằng không có gì xảy ra sau đó.
Chip Bennett
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.