it-swarm-vi.tech

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

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ự nào giữa hành động và bộ lọc móc . Cả hai đều là các 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ì?

49
Sruly

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ởi do_action_ref_array() thay vì do_action() vì sau này không hỗ trợ chuyển các biến by-Reference.)

Móc lọc

Bộ lọc móc hoạt động rất giống với Móc hành động 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 một 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 return (phiên bản sửa đổi) của tham số đầu tiên 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

Với tư cách là một bên 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ì họ 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à hook posts_where; 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à lớp SQL "where" của truy vấn hiện tại nhưng bây giờ nó chấp nhận cả mệnh đề where một tham chiếu đến thể hiện hiện tại của lớp WP_Query đang gọi móc.

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

Trong thực tế, Bộ lọc móc 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ọ là điện báo ý định của họ và do đó đưa ra hướng dẫn cho chủ đề hoặc plugin nhà phát triển 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 cái này giá trị để sửa đổi nhưng hãy chắc chắn rằng bạn chuyển nó 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 đằng sau sự khác biệt. IMO, dù sao đi nữa.

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

56
MikeSchinkel

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

Và nếu bạn nhìn vào hàm lõi do_action(), thì nó rất giống với hàm lõi apply_filters(), với một điểm khác biệt chính: 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 khi 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ị.

11
trusktr

Trong từ đơn giản.

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

Bộ lọc là các 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 tệp functions.php chủ đề của bạn.

  1. Ví dụ thứ nhất: (Đơn giản PHP ví dụ)
[.__.] chức năng test () {[.__.] echo "Đầu ra"; [.__.]} [.__.] [.___

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)
[.__.] chức năng test1 () {[.__.] echo "Đầu ra"; [.__.]} [.___ .] do_action ('kiểm tra'); [.__.]

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

[.__.] Đầu ra [.__.]

[LƯU Ý: Tại đây do_action('test') hoạt động như chức năng gọi điện. 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)
[.__.] chức năng test2 () {[.__.] echo "Kiểm tra 2"; [.__.]} [.___] [.__.] chức năng test1 () {[.__.] echo "Kiểm tra 1"; [.__.]} [.___] [.__.] do_action ('kiểm tra'); [.__.]

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

[.__.] Kiểm tra 2Test 1 [.__.]

[LƯU Ý: Tại đây do_action('test') hoạt động như chức năng gọi điện. 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ào functions.php
[.__.] chức năng test1 () {[.__.] do_action ('test_b Before'); [.___ } [.__.] add_action ('test', 'test1'); [.__.] [.___

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 thư mục /wp-content/plugins/.
  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 [.__.] */[.__.] Chức năng test_callback_feft () {[.__.] ]} [.__.] add_action ('test', 'test_callback_feft'); [.__.]

Bây giờ, Kích hoạt Plugin đơn giản 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 1Từ [.__.]

[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 default cho 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:

Đơn giản PHP ví dụ:

[.__.] $ data = mảng ('một', 'hai'); [.__.] print_r ($ data); [.__.]

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

[.__.] Mảng ([0] => một [1] => hai) [.__.]
  1. Ví dụ Một: (Sử dụng đơn giản Bộ lọc)
[.__.] $ data = application_filters ('my_filter_name', mảng ('one', 'hai')); [.__.] print_r ($ data); [.__. my_filter_name ', function ($ 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) [.__.]

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


4
maheshwaghmare