add_action (), add_filter () trước hoặc sau hàm


18

Khi xem qua các đoạn / hướng dẫn / plugin WordPress tôi thường thấy add_action()add_filter()được đặt trước khi hàm được khai báo:

add_action( 'publish_post', 'email_friends' );

function email_friends( $post_ID ) {
   $friends = 'bob@example.org, susie@example.org';
   mail( $friends, "sally's blog updated" , 'I just put something on my blog: http://blog.example.com' );
   return $post_ID;
}

Từ quan điểm logic, điều này không có ý nghĩa với tôi. Tại sao bạn sẽ đặt hàm sau khi nó được gọi trong mã của bạn? Đây thường là cách tôi sẽ xử lý tình huống tương tự:

function email_friends( $post_ID )  {
   $friends = 'bob@example.org, susie@example.org';
   mail( $friends, "sally's blog updated" , 'I just put something on my blog: http://blog.example.com' );
   return $post_ID;
}

add_action( 'publish_post', 'email_friends' );

Tôi biết cả hai kịch bản đều hoạt động, nhưng có một lợi thế cụ thể nào cho cái này hay cái kia không? Khoảng 90% thời gian tôi thấy kịch bản đầu tiên được sử dụng, do đó điều đó khiến tôi tin rằng có một lợi ích cho việc này theo một cách nào đó.

Câu trả lời:


13

Nó là dễ dàng hơn để đọc: Khi được những gì được gọi là? Nếu bạn đang gỡ lỗi một hook, bạn có thể thấy ngay bạn có phải đọc hàm hay không: Nếu đó không phải là hook của bạn, bạn có thể bỏ qua mã.

Trong các chủ đề và plugin của tôi, tôi kết hợp tất cả các đăng ký cho các hành động, bộ lọc và mã ngắn ở đầu tôi thêm hook vào khối PHPDoc:

add_action( 'wp_head',  'foo' );
add_action( 'shutdown', 'bar' );

/**
 * Foo you!
 *
 * @wp-hook wp_head
 * @return  void
 */
function foo()
{
    print '<!-- foo -->';
}

2
Mặc dù tôi không đồng ý (Chỉ vì sở thích cá nhân của tôi và thực tiễn mã hóa trong quá khứ) rằng việc đọc nó dễ dàng hơn có nghĩa là tại sao nó được thực hiện theo cách này.
voodooGQ

6

Thực tế không có sự khác biệt thực sự, ví dụ, tôi thích theo kịch bản đầu tiên, bởi vì nó gọn gàng hơn để thực hiện cuộc gọi ở một nơi và xác định các chức năng bên dưới đó. PHP phân tích toàn bộ tài liệu trước khi chạy bất cứ thứ gì và nếu các hàm được xác định đúng, mọi thứ sẽ hoạt động bình thường, không có lợi thế trong cả hai kịch bản.

Tôi tin rằng câu nói đúng ở đây là: Bất cứ điều gì nổi thuyền của bạn :)


Nó hoạt động không phải vì PHP phân tích toàn bộ tài liệu, mà bởi vì call_user_func_array()(rất có thể) được gọi sau định nghĩa hàm của bạn khi chạy do_action. Vì vậy, bạn có thể xác định hàm hooked ở bất cứ đâu cho đến thời điểm đó.
kovshenin

1

4 năm sau, nhưng tôi chắc chắn nó sẽ giúp mọi người đến đây từ tìm kiếm.

Như những người khác đã tuyên bố, không có sự khác biệt khi php phân tích toàn bộ tài liệu và thực hiện theo đúng thứ tự. Vì vậy, bất cứ điều gì bạn thích.

Cá nhân tôi thích phong cách đầu tiên:

add_action(hook, bar);
function bar(){
    //code here
}

Tôi có xu hướng suy nghĩ ngược. Mục tiêu định hướng nếu bạn muốn. Vì vậy, tôi muốn đọc, "chúng tôi đang thực hiện thanh chức năng, trong hook. Được rồi, bây giờ, chức năng này làm gì?"

Nó thiết lập bối cảnh cho chức năng tốt hơn. Tất nhiên đây chỉ là sở thích cá nhân của tôi. Vì vậy, làm những gì bạn thích.

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.