ปัญหาการทำความเข้าใจ Apply_filters ()


19

ใน Apply_filters ()

apply_filters( $tag, $value, $var ... );

ฉันมีปัญหาในการพันศีรษะ$valueและ$var. ฉันอ่านโคเด็กซ์และดูเหมือนว่า$valueสามารถแก้ไข$varได้ แต่ฉันไม่พบตัวอย่างใด ๆ ดูเหมือนว่าจะใช้เป็นวิธีการส่งตัวแปร ในกรณีใดความแตกต่างระหว่างสิ่งนั้นกับ$varอะไร

คำตอบ:


35

ลองดูฟังก์ชั่นที่มีชื่อที่ดีกว่า:

apply_filters(
    $filter_name,     // used for add_filter( $filter_name, 'callback' );
    $value_to_change, // the only variable whose value you can change
    $context_1,       // context
    $context_2        // more context
);

ดังนั้นเมื่อฟังก์ชั่นนั้นถูกเรียกว่า:

// wp-login.php line 94
apply_filters( 'login_body_class', $classes, $action );

คุณสามารถใช้ได้ …

add_filter( 'login_body_class', 'function_to_change_login_body_class', 10, 2 );

... และรับสองตัวแปรที่ส่งผ่านไปยังฟังก์ชันนั้น คุณคืนค่าแรกส่วนที่สองให้บริบทเพิ่มเติม:

function function_to_change_login_body_class( $classes, $action )
{
    if ( 'login' === $action )
        $classes[] = 'foo';

    if ( 'postpass' === $action )
        $classes[] = 'bar';

    return $classes;
}

ตัวแปรเพิ่มเติมจะช่วยให้การตัดสินใจของคุณง่ายขึ้นไม่เปลี่ยนแปลงสิ่งเหล่านั้น


ถ้าฉันเข้าใจถูกต้อง ฉันไม่เพิ่มตัวแปรเพื่อรวบรวมค่าที่ส่งคืนจาก Apply_filters เนื่องจากมีการใช้กับ $ value_to_change โดยอัตโนมัติหรือไม่
r00tAcc3ss

@ r00tAcc3ss ไม่มีอะไรเกิดขึ้นโดยอัตโนมัติ คุณต้องเปลี่ยนค่าในการติดต่อกลับ นอกจากนี้คุณยังสามารถคืนค่าได้หากคุณต้องการโดยขึ้นอยู่กับบริบท
fuxia

โอ้ใช่. ฉันหมายถึงฉันไม่ต้องยอมรับค่าที่ส่งคืนไปยังตัวแปรอื่นและกำหนดให้เป็น $ value เสร็จแล้วถ้าฉันเปลี่ยน $ value ในฟังก์ชั่น hooked และคืนค่า "อัตโนมัติ"
r00tAcc3ss

11

ตัวกรองคืออะไร

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

ขอเกี่ยวเป็นตัวกรอง

เพื่อให้ผู้ใช้เปลี่ยนข้อมูลเฉพาะบางอย่าง (ค่า, เอาท์พุทของฟังก์ชั่นอื่น ๆ ) ตัวกรองฮุกมีให้ผ่านapply_filtersฟังก์ชั่น
hooks ตัวกรองเหล่านี้มีชื่อ (หรือแท็ก ) ของตัวกรองและอย่างน้อยชื่อฟังก์ชั่นที่จะใช้ในการกรอง (เช่นเปลี่ยนแปลงในทางใดทางหนึ่ง) ข้อมูล

หากต้องการเปลี่ยนชื่อของโพสต์คุณสามารถใช้the_titleตะขอตัวกรองซึ่งกำหนดไว้ดังนี้:

apply_filters( 'the_title', $title, $id );

ซึ่งหมายความว่าตัวกรองมีแท็ก / ชื่อthe_titleพารามิเตอร์แรก$titleคือข้อมูลที่จะเปลี่ยนแปลง (เช่นชื่อโพสต์) และพารามิเตอร์ที่สอง$idคือข้อมูลเพิ่มเติม (ในกรณีนี้คือรหัสโพสต์)

หากต้องการแสดงชื่อของทุกโพสต์ใน UPPERCASE คุณสามารถใช้บรรทัดต่อไปนี้:

add_filter('the_title', 'strtoupper');

ถ้าเราดูที่add_filterฟังก์ชั่นเราจะเห็นว่ามันถูกกำหนดดังนี้:

add_filter( $tag, $function_to_add, $priority, $accepted_args );

เราระบุพารามิเตอร์ที่หนึ่งและที่สอง (จำเป็น) ในขณะที่พารามิเตอร์ที่สามและสี่ถูกตั้งค่าเป็นค่าเริ่มต้นที่เกี่ยวข้อง (เช่น10และ1)

ตัวกรองที่ซับซ้อนมากขึ้น

หากคุณต้องการกรองเฉพาะบางโพสต์คุณสามารถใช้ข้อมูลเพิ่มเติม (ในกรณีของตัวกรองนี้: ID) ในการทำเช่นนั้นคุณต้องระบุจำนวนพารามิเตอร์ (ซึ่งคือ 2 ในกรณีนี้) และเพื่อที่จะทำเช่นนี้อีกครั้งคุณต้องระบุพารามิเตอร์ลำดับความสำคัญ (ซึ่งมาก่อนจำนวนอาร์กิวเมนต์)

สมมติว่าเราต้องการส่งผลกระทบเฉพาะชื่อของโพสต์ที่มี ID 42 จากนั้นจะมีลักษณะดังนี้:

add_filter('the_title', 'my_strtoupper', 10, 2);
function my_strtoupper($title, $id) {
    if (42 === $id) return strtoupper($title);
    return $title;
} // function my_strtoupper

ในกรณีนี้เราต้องระบุพารามิเตอร์ทั้งสี่ที่มีอยู่

ฉันมีพารามิเตอร์อะไรบ้าง

ในการระบุพารามิเตอร์ (จำนวน) ที่มีอยู่ของตัวกรองบางตัวคุณจะต้องค้นหาตำแหน่งที่กำหนดไว้ (ในกรณีนี้: ที่นี่ )


การอ้างอิง :


2
+1 สำหรับการตอบสนองอย่างละเอียดและคลาสที่ไร้ที่ติ (การจัดรูปแบบที่ดี brochacho)!
bosco

ขอบคุณนั่นมันละเอียดมาก แต่ไม่ได้อธิบายสิ่งที่ฉันถาม เช่น. ความแตกต่างระหว่างตัวแปร $ value และตัวแปร $ var ในตัวกรอง
r00tAcc3ss

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