Sự khác biệt giữa bộ lọc và móc hành động?


51

Gần đây tôi đã xem xét API plugin sâu hơn một chút và tôi đã tự hỏi sự khác biệt thực sự giữa hành động và bộ lọc móc . Cả hai đều là sự kiện nhận dữ liệu dưới dạng tham số và dường như cả hai đều có thể làm những việc giống nhau.

Rõ ràng tôi thấy rằng các hành động được gọi khi các hành động diễn ra và các bộ lọc được gọi khi dữ liệu bị thao túng, nhưng dường như đó chỉ là một sự khác biệt về ngữ nghĩa.

Bên cạnh ngữ nghĩa và những gì chúng được sử dụng cho, những khác biệt thực sự giữa chúng là gì?

Câu trả lời:


58

Xin chào @Sruly :

Bạn đã trả lời khá nhiều câu hỏi của riêng bạn, nhưng tôi sẽ giải thích một chút.

Móc hành động

Hành động Móc được dự định để sử dụng khi lõi WordPress hoặc một số plugin hoặc chủ đề đang cho bạn cơ hội chèn mã của bạn tại một điểm nhất định và thực hiện một hoặc nhiều thao tác sau:

  1. Sử dụng echođể đưa một số HTML hoặc nội dung khác vào bộ đệm phản hồi,
  2. Sửa đổi trạng thái biến toàn cục cho một hoặc nhiều biến và / hoặc
  3. Sửa đổi các tham số được truyền cho hàm hook của bạn (giả sử hook được gọi bằng do_action_ref_array()thay vì vì do_action()sau này không hỗ trợ truyền biến theo tham chiếu .)

Móc lọc

Bộ lọc móc hoạt động rất giống với Action Hook nhưng mục đích sử dụng của chúng là nhận một giá trị và có khả năng trả về một phiên bản sửa đổi của giá trị. Một hook hook cũng có thể được sử dụng giống như Action Hook tức là sửa đổi biến toàn cục hoặc tạo một số HTML, giả sử đó là những gì bạn cần làm khi hook được gọi. Một điều rất quan trọng về Bộ lọc móc mà bạn không cần phải lo lắng với Action Hook là người sử dụng Bộ lọc móc phải trả về (phiên bản sửa đổi) của tham số đầu tiên được thông qua. Một lỗi người mới thường gặp là quên trả lại giá trị đó!

Sử dụng tham số bổ sung để cung cấp bối cảnh trong móc lọc

Ở một khía cạnh khác, tôi cảm thấy rằng Filter Filter bị vướng vào các phiên bản trước của WordPress vì chúng sẽ chỉ nhận được một tham số; tức là họ sẽ nhận được một giá trị để sửa đổi nhưng không có tham số thứ 2 hoặc thứ 3 để cung cấp bất kỳ bối cảnh nào. Tuy nhiên, gần đây và tích cực, có vẻ như nhóm nòng cốt WordPress đã vui vẻ (đối với tôi) đã thêm các tham số bổ sung vào Bộ lọc móc để bạn có thể khám phá thêm ngữ cảnh. Một ví dụ điển hình là posts_wherecái móc; Tôi tin rằng một vài phiên bản trở lại, nó chỉ chấp nhận một tham số là SQL lớp "where" của truy vấn hiện tại nhưng bây giờ nó chấp nhận cả mệnh đề where tham chiếu đến thể hiện hiện tại của WP_Querylớp đang gọi hook.

Vậy sự khác biệt thực sự là gì?

Trong thực tế, Filter Filter có khá nhiều siêu hành động. Cái trước có thể làm bất cứ điều gì cái sau có thể làm và một chút nữa mặc dù nhà phát triển không có trách nhiệm trả lại giá trị với Action Hook mà anh ta hoặc cô ta làm với Bộ lọc móc.

Đưa ra hướng dẫn và ý định điện báo

Nhưng đó có lẽ không phải là điều quan trọng. Tôi nghĩ điều quan trọng là bởi nhà phát triển chọn sử dụng Action Hook so với Filter Hook hoặc ngược lại họ đang truyền đạt ý định của họ và do đó đưa ra hướng dẫn cho chủ đề hoặc nhà phát triển plugin có thể đang sử dụng hook. Thực chất họ đang nói "Tôi sẽ gọi cho bạn, làm bất cứ điều gì bạn cần làm" HOẶC "Tôi sẽ chuyển cho bạn giá trị này để sửa đổi nhưng hãy chắc chắn rằng bạn sẽ trả lại ."

Vì vậy, cuối cùng tôi nghĩ rằng hướng dẫn được cung cấp bởi sự lựa chọn loại móc là giá trị thực sự đằng sau sự khác biệt . IMO, dù sao đi nữa.

Hi vọng điêu nay co ich!


Đối với tôi có vẻ như bạn có thể vừa sử dụng các bộ lọc cho mọi thứ, vì trả về một biến là tùy chọn trong PHP. Bất cứ ai cũng biết tại sao các nhà phát triển WordPress chọn có hai thuật ngữ riêng biệt? Có phải nó hoàn toàn vì lý do ngữ nghĩa? Về mặt kỹ thuật tôi không thể thấy sự cần thiết của nó ...
TheStoryCoder

2
@TheStoryCoder "Có phải hoàn toàn vì lý do ngữ nghĩa?" Dường như đó chính xác là những gì câu trả lời của tôi đã giải thích, năm (5) năm trước ...?
MikeSchinkel

11

Nếu bạn nhìn vào nguồn cho add_action()chức năng cốt lõi, nó chỉ là một trình bao bọc cho add_filter()chức năng ...

Và nếu bạn nhìn vào do_action()hàm lõi, nó rất giống với apply_filters()hàm lõi, với một điểm khác biệt rất quan trọng: nó không trả về giá trị.

Vì vậy, điều này có nghĩa là gì? các hành động giống như các bộ lọc, ngoại trừ một hành động không trả về giá trị, do đó bạn không thể sửa đổi dữ liệu. Điều đó cho thấy thật đơn giản để tạo cơ chế hoạt động của WordPress bằng cách sao chép cơ chế lọc và không trả về giá trị. Về cơ bản, tất cả những gì bạn có thể làm với một hành động chỉ đơn giản là thực thi một chức năng mà không sửa đổi một số giá trị.


5

Nói một cách đơn giản.

Các hành động là các hàm PHP thực thi đầu ra.

Bộ lọc là những hàm PHP trả về đầu ra.

Đã cập nhật: Chúng tôi có thể mở rộng bất kỳ plugin nào sử dụng các hành động và bộ lọc mà không cần sửa đổi mã. Bằng cách thêm các bộ lọc và hành động trong chủ đề hoặc plugin riêng của chúng tôi.


Sử dụng như thế nào?

Hoạt động:

Kiểm tra các ví dụ đơn giản dưới đây trong functions.phptập tin chủ đề của bạn .

  1. Ví dụ thứ nhất: (Ví dụ PHP đơn giản)
kiểm tra chức năng () {
     tiếng vang "Đầu ra";
}

kiểm tra();

Chương trình trên in đầu ra:

Đầu ra

[LƯU Ý: Ở đây test () chỉ cần gọi hàm. Và thực hiện chức năng gọi lại 'kiểm tra'.]


  1. Ví dụ hai: (Sử dụng hành động đơn giản)
hàm test1 () {
     tiếng vang "Đầu ra";
}
add_action ('test', 'test1');

do_action ('kiểm tra');

Chương trình trên in đầu ra:

Đầu ra

[LƯU Ý: Ở đây do_action('test')hoạt động như chức năng gọi. Và thực hiện chức năng gọi lại 'test1'.]


  1. Ví dụ ba: (Một cách sử dụng hành động khác)
hàm test2 () {
     tiếng vang "Thử nghiệm 2";
}
add_action ('test', 'test2', 1);

hàm test1 () {
     tiếng vang "Thử nghiệm 1";
}
add_action ('test', 'test1', 2);

do_action ('kiểm tra');

Chương trình trên in đầu ra:

Kiểm tra 2 lần 1

[LƯU Ý: Ở đây do_action('test')hoạt động như chức năng gọi. Và thực hiện các chức năng gọi lại trên các ưu tiên của nó.

Hàm gọi lại 'test1' có mức độ ưu tiên 2 Và 'test2' có mức độ ưu tiên 1.]

Nếu mức độ ưu tiên thay đổi như 'test1' với mức độ ưu tiên 1 và 'test2' với mức độ ưu tiên 2 thì đầu ra sẽ là:

Kiểm tra 1Test 2

  1. Ví dụ bốn: (Hỗ trợ của bên thứ 3) Thêm mã bên dưới vàofunctions.php
hàm test1 () {
     do_action ('test_b Before');
     tiếng vang "Thử nghiệm 1";
     do_action ('test_after');
}
add_action ('test', 'test1');

do_action ('kiểm tra');

Chương trình trên in đầu ra:

Kiểm tra 1

Bây giờ, Tạo plugin mẫu để kiểm tra cách thức hoạt động của Nhà phát triển bên thứ 3.

  1. Tạo thư mục 'đơn giản' trong /wp-content/plugins/thư mục.
  2. Tạo tập tin có tên 'Simple.php' và thêm mã bên dưới.
/ *
* Tên plugin: Plugin đơn giản
* /
hàm test_callback_function () {
     tiếng vang "Từ plugin";
}
add_action ('test', 'test_callback_feft');

Bây giờ, Kích hoạt plugin Đơn giản của chúng tôi từ bảng điều khiển quản trị viên WordPress.

Goto menu plugin và kích hoạt nó.

Sau khi kích hoạt plugin trên chương trình in đầu ra:

Kiểm tra plugin 1 từ

[LƯU Ý: Nếu chúng tôi thêm mức độ ưu tiên cho hành động plugin của chúng tôi từ 1 đến 9 thì nó sẽ in kết quả đầu ra như sau:

Từ pluginTest 1

Bởi vì, WordPress xem xét 10 priority by defaultcho tất cả các hành động được thêm vào.]

Bộ lọc

Kiểm tra các ví dụ dưới đây:

Ví dụ PHP đơn giản:

$ data = mảng ('một', 'hai');
print_r ($ dữ liệu);

Chương trình trên in đầu ra:

Mảng ([0] => một [1] => hai)
  1. Ví dụ thứ nhất: (Sử dụng bộ lọc đơn giản)
$ data = application_filters ('my_filter_name', mảng ('một', 'hai'));
print_r ($ dữ liệu);

add_filter ('my_filter_name', hàm ($ old_data) {
     trả về mảng ('ba', 'bốn');
});

Chương trình trên in đầu ra:

Mảng ([0] => ba [1] => bốn)

Ở đây, chúng tôi đã thêm bộ lọc my_filter_namevà thay đổi đầu ra hiện array( 'one', 'two' )array( 'three', 'four' )mà không thay đổi tệp chủ đề / plugin.



Cảm ơn @maheshwaghmare vì một mẹo đơn giản như vậy. vui lòng viết về 'Bộ lọc' quá
Adi

Chính xác thì bạn có ý gì bởi "sớm"?
Rapti

@Rapti Xin lỗi vì sự chậm trễ. Tối nay tôi sẽ thêm câu trả lời liên quan đến các bộ lọc. Trong tương lai tôi sẽ tạo một bài viết mô tả về Móc (Hành động & Bộ lọc).
maheshwaghmare

@maheshwaghmare chần chừ nhiều? : P

Giải thích tốt, bây giờ tôi đã hiểu rõ hơn
budiantoip
Licensed under cc by-sa 3.0 with attribution required.