ความแตกต่างระหว่างตัวกรองและตะขอการกระทำ?


51

เมื่อเร็ว ๆ นี้ฉันได้ดูที่ปลั๊กอิน API ลึกลงไปอีกเล็กน้อยและฉันก็สงสัยว่าความแตกต่างที่แท้จริงระหว่างการกระทำและตัวกรองตะขอคืออะไร พวกเขาทั้งสองเป็นเหตุการณ์ที่รับข้อมูลเป็นพารามิเตอร์และพวกเขาดูเหมือนจะสามารถทำสิ่งเดียวกันได้

เห็นได้ชัดว่าฉันเห็นว่ามีการเรียกการกระทำเมื่อมีการกระทำเกิดขึ้นและมีการเรียกใช้ตัวกรองเมื่อมีการจัดการข้อมูล แต่ดูเหมือนว่าจะเป็นความแตกต่างของการตั้งชื่อความหมาย

นอกจากความหมายและสิ่งที่ใช้แล้วความแตกต่างที่แท้จริงระหว่างพวกเขามีอะไรบ้าง

คำตอบ:


58

สวัสดี@Sruly :

คุณได้ตอบคำถามของคุณเองแล้ว แต่ฉันจะอธิบายอย่างละเอียดหน่อย

แอ็คชั่น Hooks

การกระทำ hooksมีไว้สำหรับใช้เมื่อ WordPress หลักหรือปลั๊กอินหรือชุดรูปแบบบางอย่างให้โอกาสคุณในการแทรกรหัสของคุณในบางจุดและทำอย่างน้อยหนึ่งอย่างต่อไปนี้:

  1. ใช้echoเพื่อฉีด HTMLหรือเนื้อหาอื่น ๆ ลงในบัฟเฟอร์การตอบสนอง
  2. แก้ไขสถานะตัวแปรส่วนกลางสำหรับตัวแปรหนึ่งตัวขึ้นไปและ / หรือ
  3. แก้ไขพารามิเตอร์ที่ส่งผ่านไปยังฟังก์ชัน hook ของคุณ (สมมติว่า hook ถูกเรียกใช้do_action_ref_array()แทนdo_action()เนื่องจากส่วนหลังไม่สนับสนุนการส่งผ่านตัวแปรโดยอ้างอิง )

ตะขอกรอง

ตัวกรองขอลนั้นคล้ายกับAction Hooksแต่การใช้งานตามที่ตั้งใจคือการรับค่าและอาจคืนค่าเวอร์ชันที่แก้ไขแล้ว ตะขอตัวกรองยังสามารถใช้งานได้เช่นเดียวกับ Action Hook เช่นเพื่อปรับเปลี่ยนตัวแปรทั่วโลกหรือสร้าง HTML บางอย่างโดยสมมติว่านั่นคือสิ่งที่คุณต้องทำเมื่อมีการเรียกใช้ hook สิ่งหนึ่งที่สำคัญมากเกี่ยวกับตัวกรองฮุกซึ่งคุณไม่จำเป็นต้องกังวลเกี่ยวกับ Action hooks คือผู้ที่ใช้ตัวกรองตัวกรองจะต้องส่งคืนพารามิเตอร์ตัวแรกที่ส่งผ่าน ความผิดพลาดทั่วไปที่มือใหม่คือการลืมคืนค่านั้น!

การใช้พารามิเตอร์เพิ่มเติมเพื่อจัดทำบริบทในตัวกรองขอ

นอกจากนี้ฉันรู้สึกว่า Filter Hooks ถูก hobbled ใน WordPress รุ่นก่อนหน้าเพราะพวกเขาจะได้รับพารามิเตอร์เดียวเท่านั้น เช่นพวกเขาจะได้รับค่าการแก้ไข แต่ไม่มีพารามิเตอร์ที่ 2 หรือ 3 เพื่อให้บริบทใด ๆ เมื่อเร็ว ๆ นี้และในเชิงบวกดูเหมือนว่าทีมงาน WordPress หลักมีความสุข (สำหรับฉัน) ได้รับการเพิ่มพารามิเตอร์พิเศษเพื่อกรองเบ็ดเพื่อให้คุณสามารถค้นพบบริบทมากขึ้น ตัวอย่างที่ดีคือposts_whereตะขอ ฉันเชื่อว่าสองสามเวอร์ชันกลับยอมรับเพียงหนึ่งพารามิเตอร์ที่เป็นคิวรีปัจจุบันของ"ที่ไหน"คลาส SQL แต่ตอนนี้ก็ยอมรับทั้งอนุประโยคที่และการอ้างอิงถึงอินสแตนซ์ปัจจุบันของWP_Queryชั้นเรียนที่เรียกเบ็ด

ดังนั้นความแตกต่างที่แท้จริงคืออะไร

ในความเป็นจริง Filter Hooks นั้นมีความเป็นสุดยอดของ Action Hooks อดีตสามารถทำทุกอย่างที่ทำได้และอีกเล็กน้อยแม้ว่าผู้พัฒนาจะไม่รับผิดชอบในการส่งคืนค่าด้วย Action Hook ที่เขาหรือเธอทำกับ Filter Hook

การให้คำแนะนำและเจตนาในการส่งโทรเลข

แต่นั่นอาจไม่ใช่สิ่งสำคัญ ฉันคิดว่าสิ่งที่สำคัญคือนักพัฒนาเลือกที่จะใช้ Action Hook กับ Filter Hook หรือในทางกลับกันพวกเขากำลังส่งโทรเลขแสดงเจตนาของพวกเขาและให้คำแนะนำแก่นักพัฒนาหรือผู้พัฒนาปลั๊กอินที่อาจใช้ตะขอ ในสาระสำคัญพวกเขากำลังพูดว่า"ฉันจะโทรหาคุณทำสิ่งที่คุณต้องทำ" หรือ "ฉันจะส่งค่านี้ให้คุณเพื่อแก้ไข แต่ต้องแน่ใจว่าคุณส่งมันกลับมา "

ดังนั้นในท้ายที่สุดผมคิดว่าคำแนะนำที่ระบุไว้ตามทางเลือกของประเภทเบ็ดเป็นค่าที่แท้จริงที่อยู่เบื้องหลังความแตกต่าง IMO อยู่ดี

หวังว่านี่จะช่วยได้!


สำหรับฉันดูเหมือนว่าคุณสามารถใช้ตัวกรองสำหรับทุกสิ่งได้เนื่องจากการส่งคืนตัวแปรเป็นตัวเลือกใน PHP ใครรู้ว่าทำไมนักพัฒนา WordPress เลือกที่จะมีสองคำแยกกัน? มันเป็นเพราะเหตุผลทางความหมายอย่างหมดจดหรือไม่? ในทางเทคนิคแล้วฉันไม่เห็นความต้องการมัน ...
TheStoryCoder

2
@TheStoryCoder "มันเป็นเพราะเหตุผลทางความหมายหรือเปล่า?" ดูเหมือนว่าเป็นสิ่งที่คำตอบของฉันอธิบายเมื่อห้าปีที่แล้ว ... ?
MikeSchinkel

11

หากคุณดูที่แหล่งที่มาของadd_action()ฟังก์ชั่นหลักมันเป็นเพียงเสื้อคลุมสำหรับadd_filter()ฟังก์ชั่น ...

และถ้าคุณดูที่do_action()ฟังก์ชั่นหลักมันคล้ายกับapply_filters()ฟังก์ชั่นหลักที่มีความแตกต่างที่สำคัญอย่างหนึ่ง: มันไม่ได้คืนค่า

ดังนั้นสิ่งนี้หมายความว่าอย่างไร การกระทำเป็นเหมือนตัวกรองยกเว้นการกระทำที่ไม่ส่งคืนค่าดังนั้นคุณจึงไม่สามารถแก้ไขข้อมูลได้ มันแสดงให้เห็นว่ามันง่ายในการสร้างกลไกการกระทำของ WordPress โดยเพียงแค่คัดลอกกลไกการกรองและไม่คืนค่า โดยพื้นฐานแล้วสิ่งที่คุณสามารถทำได้ด้วยการกระทำก็คือการใช้งานฟังก์ชั่นโดยไม่ต้องแก้ไขค่าบางอย่าง


5

ในคำง่าย ๆ

การดำเนินการ เป็นฟังก์ชั่น PHP ที่ทำหน้าที่ส่งออก

ตัวกรอง คือฟังก์ชัน PHP ที่ส่งคืนเอาต์พุต

อัปเดต:เราสามารถขยายปลั๊กอินใด ๆ ที่ใช้การกระทำและตัวกรองโดยไม่ต้องแก้ไขโค้ด โดยการเพิ่มตัวกรองและการกระทำในชุดรูปแบบหรือปลั๊กอินของเราเอง


วิธีใช้?

หนังบู๊:

ตรวจสอบตัวอย่างง่ายๆด้านล่างในfunctions.phpไฟล์ธีมของคุณ

  1. ตัวอย่างที่หนึ่ง: (ตัวอย่าง PHP อย่างง่าย)
ทดสอบฟังก์ชั่น () {
     echo "เอาท์พุต";
}

ทดสอบ();

โปรแกรมด้านบนพิมพ์ผลลัพธ์:

เอาท์พุต

[หมายเหตุ: นี่คือการทดสอบ () เพียงเรียกใช้ฟังก์ชัน และดำเนินการฟังก์ชั่นการโทรกลับ 'ทดสอบ']


  1. ตัวอย่างที่สอง: (การใช้การกระทำอย่างง่าย)
ฟังก์ชั่น test1 () {
     echo "เอาท์พุต";
}
add_action ('ทดสอบ', 'test1');

do_action ('ทดสอบ');

โปรแกรมด้านบนพิมพ์ผลลัพธ์:

เอาท์พุต

[หมายเหตุ: ที่นี่ใช้do_action('test')งานได้เหมือนฟังก์ชั่นการโทร และเรียกใช้ฟังก์ชันการเรียกกลับ 'test1']


  1. ตัวอย่างที่สาม: (ใช้ประโยชน์จากการกระทำอื่น)
ฟังก์ชั่น test2 () {
     echo "ทดสอบ 2";
}
add_action ('ทดสอบ', 'test2', 1);

ฟังก์ชั่น test1 () {
     echo "ทดสอบ 1";
}
add_action ('ทดสอบ', 'test1', 2);

do_action ('ทดสอบ');

โปรแกรมด้านบนพิมพ์ผลลัพธ์:

ทดสอบ 2 ทดสอบ 1

[หมายเหตุ: ที่นี่ใช้do_action('test')งานได้เหมือนฟังก์ชั่นการโทร และดำเนินการฟังก์ชั่นการโทรกลับในลำดับความสำคัญของมัน

ฟังก์ชั่นโทรกลับ 'test1' มีลำดับความสำคัญ 2 และ 'test2' มีลำดับความสำคัญ 1]

หากลำดับความสำคัญมีการเปลี่ยนแปลงเช่น 'test1' ที่มีลำดับความสำคัญ 1 และ 'test2' ที่มีลำดับความสำคัญ 2 ผลลัพธ์จะเป็น:

ทดสอบ 1 ทดสอบ 2

  1. ตัวอย่างที่สี่: (รองรับบุคคลที่สาม) เพิ่มรหัสด้านล่างในfunctions.php
ฟังก์ชั่น test1 () {
     do_action ('test_before');
     echo "ทดสอบ 1";
     do_action ('test_after');
}
add_action ('ทดสอบ', 'test1');

do_action ('ทดสอบ');

โปรแกรมด้านบนพิมพ์ผลลัพธ์:

ทดสอบ 1

ตอนนี้สร้างปลั๊กอินตัวอย่างเพื่อตรวจสอบว่ามันทำงานอย่างไรสำหรับนักพัฒนาบุคคลที่สาม

  1. สร้างโฟลเดอร์ 'ง่าย' ใน/wp-content/plugins/ไดเรกทอรี
  2. สร้างไฟล์ชื่อ 'simple.php' และเพิ่มรหัสด้านล่าง
/ *
* ชื่อปลั๊กอิน: ปลั๊กอินง่าย ๆ
* /
ฟังก์ชั่น test_callback_function () {
     echo "จากปลั๊กอิน";
}
add_action ('ทดสอบ', 'test_callback_function');

ตอนนี้เปิดใช้งานปลั๊กอินง่าย ๆของเราจากแดชบอร์ดผู้ดูแลระบบ WordPress

ไปที่ปลั๊กอินเมนูแล้วเปิดใช้งาน

หลังจากเปิดใช้งานปลั๊กอินด้านบนโปรแกรมพิมพ์ผลลัพธ์:

ทดสอบ 1 จากปลั๊กอิน

[หมายเหตุ: หากเราเพิ่มความสำคัญสำหรับการกระทำปลั๊กอินของเราจาก 1 ถึง 9 มันจะพิมพ์ผลลัพธ์เช่น:

จาก pluginTest 1

เพราะ, WordPress พิจารณาการ10 priority by defaultกระทำที่เพิ่มทั้งหมด]

ฟิลเตอร์

ตรวจสอบตัวอย่างด้านล่าง:

ตัวอย่าง PHP ง่าย ๆ :

$ data = array ('หนึ่ง', 'สอง');
print_r (ข้อมูล $);

โปรแกรมด้านบนพิมพ์ผลลัพธ์:

Array ([0] => หนึ่ง [1] => สอง)
  1. ตัวอย่างที่หนึ่ง: (ใช้ตัวกรองอย่างง่าย)
$ data = Apply_filters ('my_filter_name', อาร์เรย์ ('หนึ่ง', 'สอง'));
print_r (ข้อมูล $);

add_filter ('my_filter_name', ฟังก์ชัน ($ old_data) {
     กลับอาร์เรย์ ('สาม', 'สี่');
});

โปรแกรมด้านบนพิมพ์ผลลัพธ์:

Array ([0] => สาม [1] => สี่)

ที่นี่เราได้เพิ่มตัวกรองmy_filter_nameและเปลี่ยนผลลัพธ์ที่มีอยู่array( 'one', 'two' )ด้วยarray( 'three', 'four' )โดยไม่ต้องเปลี่ยนไฟล์ธีม / ปลั๊กอิน



ขอบคุณ @maheshwaghmare สำหรับเคล็ดลับง่ายๆ โปรดเขียนเกี่ยวกับ 'ตัวกรอง' ด้วย
Adi

คุณหมายถึงอะไรโดยเร็ว ๆ นี้?
Rapti

@Rapti ขออภัยในความล่าช้า คืนนี้ฉันจะเพิ่มคำตอบที่เกี่ยวข้องกับตัวกรอง ในอนาคตฉันจะสร้างบทความอธิบายเกี่ยวกับ Hooks (การทำงาน & ตัวกรอง)
maheshwaghmare

@maheshwaghmare ผัดวันประกันพรุ่งมาก? : P

คำอธิบายที่ดีฉันมีความเข้าใจที่ดีขึ้นในขณะนี้
budiantoip
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.