wake-up-neo.com

wp_headers vs send_headers. Wann soll jeder verwendet werden?

Ich habe wp_headers und send_headers gesehen, die beide zuvor für die gleiche Sache verwendet wurden, und ich frage mich, wie Sie vermutlich wissen sollen, welche zu verwenden ist und wann ...

Auf der Codex-Seite send_headers gibt es ein Beispiel für das Hinzufügen des X-UA-Compatible: IE=Edge,chrome=1 aus Gründen der Abwärtskompatibilität mit Internet Explorer, da das Metatag häufig auf Intranetsites fehlschlägt, wenn es zu spät geladen wird .

So sieht das send_headers-Beispiel aus:

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

Allerdings kann wp_headers dies auch tun:

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

Update: Eigentlich ist mir gerade aufgefallen, dass ein Gespräch darüber vor ein paar Jahren mehr oder weniger mit einer ähnlichen Frage begonnen hat ...

Hat send_headers nur mit dem Frontend zu tun? Ich habe gesehen, wie wp_headers solche Prüfungen durchgeführt hat:

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

und

if (!is_admin()) 

also denke ich, dass send_headers diese Überprüfungen vielleicht nicht durchführen muss ...

9
Bryan Willis

Ok also denke ich, dass ich es herausgefunden habe ...

Beide funktionieren größtenteils wie erwartet, indem Sie http/php-Header an den Browser senden. wp_headers ist eigentlich ein Filter innerhalb der send_headers() -Funktionen. Sie können dies verwenden, um die Header zu ändern, bevor sie mit einigen Ausnahmen an den Browser gesendet werden. wp_headers kann nichts tun, wenn es sich um eine statisch zwischengespeicherte Seite handelt ...

Hier kommt der Hook send_headers ins Spiel. Nach dem Filter wp_headers überprüft die Funktion send_headers(), ob Last-Modified gesendet wurde, ob die Seite zwischengespeichert wurde oder nicht, und lässt uns nach dem Senden von Caching, Inhaltstyp usw. einbinden.

Für mein Beispiel mit X-UA-Compatible bin ich also geneigt, send_headers zu verwenden, obwohl beide funktionieren. Warum? Zum einen, wenn Sie beide hinzufügen, gewinnt send_headers jedes Mal und stellt sicher, dass er geladen wird, auch wenn er nach dem Zwischenspeichern der Seite hinzugefügt wird.

Während die Verwendung eines <meta>-Tags wie viele gängige Frameworks verwenden auch für x-ua-kompatible Systeme funktioniert, funktioniert es in vielen Browsern nur, wenn es fast unmittelbar nach dem öffnenden head-Tag geladen wird. Dies wird aus verschiedenen Gründen verursacht, z. B. wenn die Einstellung "Intranet" netzwerkweit festgelegt ist . Aus diesem Grund ist die Verwendung der PHP-Methode sicherer. Wenn Sie jedoch beide hinzufügen, gewinnt das Meta-Tag (vorausgesetzt, es wurde früh genug eingefügt).

In Bezug auf X-UA-Compatible-kompatibel hoffe ich, dass dies bald irrelevant sein wird, da Microsoft den Support einstellt nächste Woche für ältere Versionen von IE!


Außerdem habe ich den wp_headers-Filter ohne die is_admin()-Prüfung getestet und die admin_headers werden nicht geändert, sodass keine Prüfung erforderlich ist.

Wenn Sie die Admin-Header aus irgendeinem Grund ändern mussten, wissen Sie, dass Sie dies so tun können, aber ich bin mir nicht sicher, ob es die ganze Zeit funktionieren würde ...

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

Aktualisierte Antwort basierend auf Toschos Vorschlag, nach Admin zu suchen:

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