Sử dụng wp init hook để gọi các hook khác?


11

Tôi muốn biết nếu đó là một thực hành tốt theo chủ đề WordPress hoặc phát triển plugin.

add_action('init','all_my_hooks');

function all_my_hooks(){

// some initialization stuff here and then

add_action('admin_init',-----);
add_action('admin_menu',----);

// more like so

}

cảm ơn

Câu trả lời:


16

Nói chung: Có, hãy đợi một hook chuyên dụng để bắt đầu mã của riêng bạn. Không bao giờ chỉ ném một đối tượng vào không gian tên toàn cầu. Nhưng inithiếm khi cần thiết.

Bạn móc vào càng muộn càng tốt. Nếu mã đầu tiên của bạn chạy wp_headkhông sử dụng hook trước đó. Bạn thậm chí có thể móc tầng :

add_action( 'wp_head', 'first_callback' );

function first_callback()
{
    // do something
    // then
    add_action( 'wp_footer', 'second_callback' );
}

Về initmóc: Sử dụng wp_loadedthay thế. Điều đó chạy sau initvà sau ms_site_check()được gọi. Bằng cách này, bạn tránh chạy plugin của mình trên một trang con không hợp lệ trong bản cài đặt nhiều trang. Mọi thứ khác là như nhau.


3
+1 cho wp_loadedvà thông tin MS.
kaiser

cảm ơn rất nhiều vì phản hồi của bạn, vẫn còn một nghi ngờ, đó là tải tốt hơn tất cả các hook khác bên trong wp_loaded hoặc tải chúng một cách riêng biệt? Tôi tự hỏi nếu tôi thêm hook trong wp_loaded thì chúng sẽ được hook sớm hơn thay vì bị hook sau admin_init hoặc admin_menu?
atinder

móc tầng không phải là một vấn đề?
atinder

Không, tại sao nó phải như vậy? Gọi hook thứ hai chỉ khi cái đầu tiên hữu ích.
fuxia

3

Tôi không thấy những lợi ích lớn của thực hành này, vì những lý do sau:

Chức năng gọi lại của bạn không được gọi khi đăng ký

Các hàm add_actionadd_filterchỉ thêm một mục vào biến toàn cục $wp_filterchứa tất cả các bộ lọc và hành động. Xem nguồn . Nó không gọi chức năng của bạn. Mã của bạn sẽ chỉ chạy khi do_actionapply_filtersđược gọi (với tên hook thích hợp), xảy ra rất muộn ở nơi mà các hook đó phải ở.

Bạn có thể nói rằng làm như vậy sẽ làm cho biến toàn cục $wp_filtertrở nên lớn hơn => cần thêm bộ nhớ. Nhưng tôi nghĩ việc tạo ra một chức năng mới có cùng một vấn đề.

Mã tổ chức

Đặt mọi thứ vào một chức năng buộc bạn phải nhớ tất cả các hook trong mỗi tệp trong theme / plugin của bạn. Bạn sẽ không làm điều gì đó như thế này:

  • trong header.php: thêm các hàm hook và hàm gọi lại cho những thứ xảy ra trong tiêu đề (như menu, tập lệnh đăng ký)
  • trong content.php: thêm hàm hook và hàm gọi lại để lọc nội dung
  • admin-menu.php: thêm móc và chức năng gọi lại để thêm menu quản trị

(giả sử rằng các tệp đó được đặt trong chủ đề / plugin của bạn)

Thay vào đó, bạn phải:

  • đặt chức năng gọi lại chỉ ở header.php, content.php,admin-menu.php
  • và đặt tất cả các hook trong một hàm tách biệt trong một tệp khác

=> Điều đó sẽ khiến bạn khó biết điều gì xảy ra khi bạn xem nội dung của header.phptệp. Bạn phải tìm kiếm để biết khi nào các cuộc gọi lại được thực hiện.

Và suy nghĩ về tình huống khi bạn có nhiều lớp trong chủ đề / plugin của bạn. Bạn có đặt tất cả các hook của tất cả các lớp ở một nơi không? Hay mỗi lớp có một hàm bao bọc chứa tất cả các hook? Quá dư thừa!

Trên những lý do này, tôi nghĩ đó là phong cách cá nhân :). Tôi thấy một số khuôn khổ như Hybrid làm những gì bạn nói. Đôi khi nó làm cho tôi khó đào trong những khuôn khổ đó!

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.