wp_headers vs send_headers ใช้เมื่อใด?


10

ฉันเคยเห็นwp_headersและsend_headersทั้งคู่เคยใช้มาเพื่อสิ่งเดียวกันและฉันสงสัยว่าคุณควรจะรู้ว่าควรใช้อันไหนและเมื่อ ...

บนsend_headersหน้า Codexมีตัวอย่างของการเพิ่มที่X-UA-Compatible: IE=edge,chrome=1สำหรับ Internet Explorer กันได้ย้อนหลังตั้งแต่เมตาแท็กมักจะล้มเหลวบนไซต์อินทราเน็ตถ้าโหลดสายเกินไป

นี่คือsend_headersตัวอย่างที่มีลักษณะ:

add_action( 'send_headers', 'add_header_xua' );
function add_header_xua() {
    header( 'X-UA-Compatible: IE=edge,chrome=1' );
}

อย่างไรก็ตามwp_headersยังสามารถทำสิ่งนี้:

apply_filters ( 'wp_headers', array $headers, WP $this )

add_filter( 'wp_headers', 'wpieeam_headers' );
function wpieeam_headers($headers) {
    if (!is_admin()) {
        $headers['X-UA-Compatible'] = 'IE=edge,chrome=1';    
    }
    return $headers;
}

อัปเดต:จริง ๆ แล้วฉันเพิ่งสังเกตเห็นว่าการสนทนาในเรื่องนี้เริ่มต้นจากคำถามที่คล้ายกันเมื่อสองสามปีก่อน ...

นอกจากนี้ send_headers เกี่ยวข้องกับส่วนหน้าเท่านั้นหรือไม่ ฉันเคยเห็น wp_headers ทำการตรวจสอบเช่นนี้:

if ( isset($_SERVER['HTTP_USER_AGENT']) && (strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE') !== false) )

และ

if (!is_admin()) 

ดังนั้นฉันคิดว่าอาจsend_headersจะไม่ต้องทำการตรวจสอบเหล่านั้น ...


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

คำตอบ:


9

ตกลงดังนั้นฉันคิดว่าฉันคิดออก ...

ทั้งสองอย่างนี้ทำงานได้ดีที่สุดตามที่คุณคาดหวังโดยส่งส่วนหัว http / php ไปยังเบราว์เซอร์ wp_headersจริงๆแล้วมันเป็นตัวกรองภายในsend_headers()ฟังก์ชั่นคุณสามารถใช้สิ่งนี้เพื่อแก้ไขส่วนหัวก่อนที่พวกเขาจะถูกส่งไปยังเบราว์เซอร์ด้วยข้อยกเว้น wp_headersจะไม่สามารถทำอะไรได้หากเป็นหน้าแคชแบบสแตติกที่กำลังติดต่อกับ ...

นี่คือที่send_headersเบ็ดเข้ามาเล่น หลังจากwp_headersตัวกรองsend_headers()ฟังก์ชั่นการตรวจสอบว่าLast-Modifiedได้รับการส่งด้วยจะบอกเราว่าหน้าถูกแคชหรือไม่และจากนั้นให้เราเข้าสู่มันหลังจากแคชประเภทเนื้อหา ฯลฯ ได้รับการส่งทั้งหมด

ดังนั้นสำหรับตัวอย่างของฉันใช้ในขณะที่พวกเขาทั้งสองทำงานผมมีแนวโน้มที่จะใช้งานX-UA-Compatible ทำไม? สำหรับหนึ่งถ้าคุณจะเพิ่มทั้งสองนี้จะชนะทุกครั้งและจะให้แน่ใจว่ามันถูกโหลดแม้ว่าจะเพิ่มหลังจากหน้าแคชsend_headerssend_headers

ในขณะที่ใช้<meta>แท็กเช่นการใช้งานเฟรมเวิร์ยอดนิยมหลายอย่างก็ใช้งานได้กับ x-ua-compatible แต่จะไม่ทำงานในเบราว์เซอร์จำนวนมากเว้นแต่จะโหลดในทันทีหลังจากแท็กเปิดหัว ปัญหานี้เกิดจากสาเหตุหลายประการเช่นหากการตั้งค่า "อินทราเน็ต" ถูกตั้งค่าเครือข่ายไวด์ ด้วยเหตุนี้การใช้เมธอด php จึงปลอดภัยกว่า อย่างไรก็ตามหากคุณต้องเพิ่มทั้งสองเมตาแท็กจะชนะ (สมมติว่ามันรวมเร็วพอ

เกี่ยวกับX-UA-Compatibleความเข้ากันได้ฉันหวังว่ามันจะไม่เกี่ยวข้องเร็ว ๆ นี้เนื่องจากMicrosoft กำลังลดการสนับสนุน IE เวอร์ชันเก่าในสัปดาห์หน้า!


นอกจากนี้ฉันทดสอบwp_headersตัวกรองโดยไม่ใช้การis_admin()ตรวจสอบและจะไม่แก้ไข admin_headers เพื่อให้การตรวจสอบนั้นไม่จำเป็น

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

function admin_add_my_header() {
    header('X-UA-Compatible: IE=edge,chrome=1');    
}
add_action( 'admin_init', 'admin_add_my_header', 1 );

อัปเดตคำตอบตามคำแนะนำของ Toscho เพื่อตรวจสอบผู้ดูแลระบบ:

is_admin() || add_action('send_headers', function(){ 
    header('X-UA-Compatible: IE=edge,chrome=1'); 
}, 1);

2
คุณยังควรใช้is_admin() || add_action( … )เพราะไม่จำเป็นต้องทำให้รายการโทรกลับที่ลงทะเบียนสกปรกหากคุณไม่ต้องการใช้
fuxia

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

Toscho ฉันปรับปรุงคำตอบของฉันตามคำแนะนำของคุณ นั่นคือสิ่งที่คุณหมายถึงอะไร
ไบรอัน Willis

ใช่ดูขวา :)
fuxia

send_headersจะชนะทุกครั้งและจะมั่นใจได้ว่าโหลดได้แม้ว่าจะเพิ่มหลังจากหน้าแคชแล้ว” - โปรดทราบว่าsend_headersไม่สามารถเอาชนะหน้าแคชที่ใช้โดยปลั๊กอินเช่น W3 Total Cache ในการทดสอบของฉันหรือแคชแบบคงที่ใด ๆ ที่มีประสิทธิภาพบายพาส WordPress ในระดับเซิร์ฟเวอร์
Nick
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.