add_action (), add_filter () ก่อนหรือหลังฟังก์ชั่น


18

เมื่อมองผ่านตัวอย่างบทเรียน / ปลั๊กอิน / WordPress ฉันมักจะเห็นadd_action()และadd_filter()วางไว้ก่อนที่จะประกาศฟังก์ชั่น:

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;
}

จากมุมมองเชิงตรรกะนี้มันไม่สมเหตุสมผลสำหรับฉัน ทำไมคุณต้องวางฟังก์ชั่นหลังจากที่มันถูกเรียกในรหัสของคุณ? นี่เป็นวิธีที่ฉันจะรับมือกับสถานการณ์เดียวกัน:

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' );

ฉันรู้ว่าสถานการณ์ทั้งสองทำงานได้ แต่มีข้อได้เปรียบอย่างใดอย่างหนึ่งหรืออื่น ๆ ? ประมาณ 90% ของเวลาที่ฉันเห็นสถานการณ์แรกที่ใช้ทำให้ฉันเชื่อว่ามีประโยชน์ในทางใดทางหนึ่ง

คำตอบ:


13

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

ในชุดรูปแบบและปลั๊กอินของฉันฉันรวมการลงทะเบียนทั้งหมดสำหรับการดำเนินการตัวกรองและรหัสย่อที่ด้านบนและฉันเพิ่มเบ็ดลงในบล็อก PHPDoc:

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

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

2
แม้ว่าฉันจะไม่เห็นด้วย (เพียงเพราะความชอบส่วนตัวของฉันและการเขียนโค้ดที่ผ่านมา) ว่าการอ่านข้อความนี้ง่ายขึ้นจะทำให้เข้าใจได้ว่าทำไมมันถึงทำแบบนี้
voodooGQ

6

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

ฉันเชื่อว่าคำพูดที่ถูกต้องคือ: ไม่ว่าเรือของคุณจะลอย :)


มันทำงานไม่ได้เพราะ PHP แยกวิเคราะห์เอกสารทั้งหมด แต่เนื่องจากcall_user_func_array()เป็น (ส่วนใหญ่มีแนวโน้ม) do_actionเรียกว่าหลังจากนิยามการทำงานของคุณเมื่อใช้งาน ดังนั้นคุณสามารถกำหนดฟังก์ชั่น hooked ได้ทุกที่จนถึงจุดนั้น
kovshenin

1

4 ปีต่อมา แต่ฉันแน่ใจว่ามันจะช่วยให้ผู้คนมาที่นี่จากการค้นหา

ตามที่คนอื่นได้กล่าวไว้ไม่มีความแตกต่างเมื่อ php แยกวิเคราะห์เอกสารทั้งหมดและดำเนินการตามลำดับที่ถูกต้อง ดังนั้นไม่ว่าคุณจะชอบอะไร

ฉันชอบสไตล์แรกโดยส่วนตัว:

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

ฉันมักจะคิดย้อนหลัง เป้าหมายที่มุ่งเน้นถ้าคุณจะ ฉันอยากอ่านว่า "เรากำลังทำบาร์ฟังก์ชั่นอยู่ในเบ็ดเอาล่ะเจ๋งดีตอนนี้ฟังก์ชั่นทำอะไร?

มันตั้งค่าบริบทสำหรับฟังก์ชั่นที่ดีขึ้น แน่นอนว่านี่เป็นเพียงความชอบส่วนตัวของฉัน ทำในสิ่งที่คุณชอบ

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