ตัวกรองและ hooks ทำงานอย่างไรใน PHP อย่างแท้จริง


21

ตัวกรองและ hooks ใช้งานได้จริงใน WordPress อย่างไร

ฉันกำลังถามเกี่ยวกับบางสิ่งที่ก้าวหน้า มันใช้งานอย่างไรใน PHP? เช่นวิธีการรวบรวม hooks ทั้งหมดจากปลั๊กอินที่แตกต่างกันและ "แนบ" ไปยังแกนหลัก ฯลฯ


2
เท่าที่ฉันรู้ว่าไม่มี 'hooks' หรือ 'filters' ใน php มีฟังก์ชั่น Wordpress มีฟังก์ชั่นพิเศษที่ก่อนการประหารชีวิตจะใช้การเรียกกลับของฟังก์ชั่นอื่น ๆ
Ofir Baruch

ที่เกี่ยวข้อง: wordpress.stackexchange.com/questions/103641/…
s_ha_dum

3
@OfirBaruch ฉันค่อนข้างมั่นใจว่า OP หมายถึงการนำไปใช้ใน WordPress และไม่ได้แนะนำว่ามีการใช้งาน PHP แบบดั้งเดิมอยู่
Tom Auger

คำตอบ:


33

ภาพรวม

โดยทั่วไป " ปลั๊กอิน API " ซึ่งเรียกตัวกรองและฮุกประกอบด้วยฟังก์ชันต่อไปนี้:

  1. apply_filters()- ดำเนินการ
  2. do_action- ดำเนินการ
  3. apply_filters_ref_array()- ดำเนินการ
  4. do_action_ref_array()- ดำเนินการ
  5. add_filter()- เพิ่มลงในสแต็ก
  6. add_action()- เพิ่มลงในสแต็ก

Internals พื้นฐาน

โดยรวมแล้วมีสองสามกลม (อะไรในโลก WordPress) ที่เกี่ยวข้อง:

global $wp_filter, $wp_actions, $wp_current_filter, $merged_filters;

คนแรก$wp_filterคือโลกArrayที่มีชื่อตัวกรองทั้งหมดเป็น subarrays แต่ละ subarrays เหล่านั้นจะเก็บ subarrays ที่เรียกกลับภายใต้อาเรย์ลำดับความสำคัญมากยิ่งขึ้น

สรุปในเชิงลึก

ดังนั้นเมื่อมีการเรียกใช้ฟังก์ชั่นการทำงาน WordPress จะค้นหาแถวต่างๆเหล่านั้นเพื่อหากุญแจที่มีชื่อนั้น จากนั้น callbacks ที่แนบมาจะได้รับการดำเนินการตามลำดับความสำคัญหลังจากนั้น สิ่งเดียวที่เกิดขึ้นข้างหน้าคือการเรียกกลับที่แนบมากับallตัวกรอง

เมื่อคุณเพิ่มการโทรกลับโดยใช้add_actionหรือadd_filterก่อนอื่นเวิร์ดเพรสจะคำนวณ ID "ที่ไม่ซ้ำ" เพื่อไม่ให้เขียนทับการโทรกลับที่แนบมา

$idx = _wp_filter_build_unique_id($tag, $function_to_add, $priority);

จากนั้นจะเพิ่มการโทรกลับไปที่global $wp_filterสแต็ก:

$wp_filter[ $tag ][ $priority ][ $idx ] = array(
    'function'      => $function_to_add,
    'accepted_args' => $accepted_args
);

ในขณะที่คุณสามารถเห็นอาร์เรย์ย่อยหลักคือ$tag(หรือการกระทำ / ชื่อตัวกรอง) จากนั้นทุกอย่างจะถูกเรียกภายใต้ลำดับความสำคัญที่เฉพาะเจาะจงและจากนั้นสตริง "โทรกลับ / ID" ที่ไม่ซ้ำได้รับการใช้เป็นกุญแจสำคัญ

ต่อมาเมื่อตัวกรองได้รับการเรียก - เกิดขึ้นกับ$tag/ action- / filter-name - อาร์เรย์จะได้รับการค้นหาและการเรียกกลับได้รับการเรียก ในขณะที่ใช้งานอยู่call_user_func_arrayมันไม่สำคัญว่าจะมีอาร์กิวเมนต์จำนวนเท่าใดที่แนบมาด้วย WordPress แก้ปัญหาด้วยตัวเอง

foreach ( (array) current( $wp_filter[ $tag ] ) as $the_ )
{
    call_user_func_array(
        $the_['function'], 
        array_slice(
            $args, 
            0, 
            (int) $the_['accepted_args']
        )
    );
}

3
อย่าลืมว่ามันกำลังผ่านการเรียกกลับมันสั่งให้ดำเนินการเรียกกลับหลายครั้งใน hook เดียวกันโดยใช้ "ลำดับความสำคัญ" ของพวกเขาซึ่งถูกตั้งค่า (ทางเลือก) ด้วย add_action () และ Apply_filters () และค่าเริ่มต้นที่ 10
Tom สว่าน

1
@TomAuger โปรดเพิ่มบันทึกเพิ่มเติมและแก้ไขคำตอบ
ไกเซอร์

5

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

ตัวอย่างคือตะขอ wp_head ใน WordPress คุณสามารถใช้เบ็ดนี้ในชุดรูปแบบลูกของคุณเพื่อเพิ่มเนื้อหาในตำแหน่งนั้น '

ตัวอย่าง:

add_action('wp_head', 'add_content_to_head');
function add_content_to_head() {
echo 'Your Content';
}

ชุดรูปแบบพรีเมี่ยมบางตัวยังมีตะขอการกระทำที่คุณสามารถใช้ในชุดรูปแบบลูกเพื่อทำสิ่งเดียวกัน นี่คือแผนที่ภาพซึ่งรวมถึงแอคชั่นฮุคและตำแหน่งที่พวกเขาแสดงผลเนื้อหาของคุณในเฟรมเวิร์กชุดรูปแบบ Genesis

ตัวอย่าง:

add_action('genesis_header', 'add_content_to_header');
function add_content_to_header() {
echo 'Your Content';
}

นี่คือลักษณะของ hook หากคุณเปิดไฟล์ header.php ในเฟรมเวิร์กชุดรูปแบบ Genesis:

do_action( 'genesis_header' );

นี่คือรายการของ WordPress hooks ที่คุณสามารถใช้ได้หลายวิธี

ตัวกรองช่วยให้คุณสามารถปรับเปลี่ยนการส่งออกของฟังก์ชั่นที่มีอยู่และรวมอยู่ในไฟล์หลักของ WordPress และเฟรมเวิร์กธีมหลักบางอย่างเช่น Genesis

นี่คือรายการตัวกรองที่คุณสามารถใช้กับ Genesis Design Framework

นี่คือรายการของตัวกรองที่รวมอยู่ใน WordPress

นี่คือตัวอย่างของวิธีที่คุณสามารถใช้ตัวกรองในเฟรมเวิร์กชุดรูปแบบเช่น Genesis:

add_filter( 'comment_author_says_text', 'custom_comment_author_says_text' );
function custom_comment_author_says_text() {
return 'author says';
}

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

นี่เป็นอีกตัวอย่างที่กำหนดความยาวของข้อความที่ตัดตอนมาถึง 50 คำ:

add_filter( 'excerpt_length', 'change_excerpt_length' );
function change_excerpt_length($length) {
return 50; 
}

คุณจะพบฟังก์ชัน the_excerpt () ในไฟล์ wp- include / post-template.php

นี่คือสิ่งที่ดูเหมือนว่า:

  function the_excerpt() {
        echo apply_filters('the_excerpt', get_the_excerpt());
}

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

โดยทั่วไป hooks และตัวกรองช่วยให้คุณสามารถปรับแต่งและแก้ไขทั้ง WordPress และธีมหลักของคุณโดยไม่ต้องแก้ไขไฟล์ WordPress หลักหรือไฟล์ธีมหลักของคุณ

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


2
นี่เป็นภาพรวมทั่วไปของ hooks และตัวกรองที่ยอดเยี่ยม แต่ฉันกลัวว่าคำถามของ OP จะหายไปหมดซึ่งเป็นเรื่องเกี่ยวกับการทำงานของ hooks และวิธีที่ WordPress สร้างจัดเก็บและประมวลผลพวกเขา คำตอบที่ดี; คุณน่าจะเชื่อมโยงไปยังบทช่วยสอนของคุณบน WP Sites
Tom Auger

ตกลงฉันจะลบมัน ของฉันไม่ดีเท่าที่ฉันควรจะอ่านคำถามที่ดีกว่า แต่คิดว่าคำตอบที่ได้รับแล้วจะง่ายขึ้นสำหรับผู้เริ่มต้นที่จะเข้าใจถ้าพวกเขารู้พื้นฐานก่อน
แบรดดัลตัน

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