wp_headers vs send_headers. Wann sollte jeder verwendet werden?

10

Ich habe gesehen wp_headersund send_headersbeide schon einmal für dasselbe verwendet und ich frage mich, wie Sie wissen sollen, welches Sie wann verwenden sollen ...

Auf der send_headersCodex-Seite finden Sie ein Beispiel für das Hinzufügen der X-UA-Compatible: IE=edge,chrome=1Abwärtskompatibilität für Internet Explorer, da das Meta-Tag auf Intranetsites häufig fehlschlägt, wenn es zu spät geladen wird .

send_headersSo sieht das Beispiel aus:

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

Allerdings wp_headerskann 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: Mir ist gerade erst aufgefallen, dass vor ein paar Jahren ein Gespräch darüber mehr oder weniger mit einer ähnlichen Frage begann ...

Hat send_headers auch nur mit dem Frontend zu tun? Ich habe gesehen, wie wp_headers folgende Überprü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_headersich diese Kontrollen vielleicht nicht machen muss ...

Bryan Willis
quelle
1
Generell ist einer eine Aktion und der andere ein Filter. Aktionen dienen dazu, etwas zu tun, wenn ein Ereignis auftritt, und ein Filter dient dazu, etwas zu ändern, bevor es verwendet wird.
Milo

Antworten:

9

Ok, ich denke ich habe es herausgefunden ...

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

Hier kommt der send_headersHaken ins Spiel. Nach dem wp_headersFilter send_headers()prüft die Funktion, ob Last-Modifiedmit gesendet wurde, ob die Seite zwischengespeichert wurde oder nicht, und lässt uns dann einbinden, nachdem Caching, Inhaltstyp usw. gesendet wurden.

Für mein Beispiel mit X-UA-Compatible, während beide funktionieren, neige ich dazu, zu verwenden send_headers. Warum? Zum einen würde, wenn Sie beide hinzufügen send_headerswürden, jedes Mal gewinnen und sicherstellen, dass es geladen wird, selbst wenn es hinzugefügt wird, nachdem die Seite zwischengespeichert wurde.

Während die Verwendung eines <meta>Tags, wie es in vielen gängigen Frameworks verwendet wird , auch für x-ua-kompatibel 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 eingestellt ist . Aus diesem Grund ist die Verwendung der PHP-Methode sicherer. Wenn Sie jedoch beide hinzufügen würden, würde das Meta-Tag gewinnen (vorausgesetzt, es wurde früh genug aufgenommen.

In Bezug auf die X-UA-CompatibleKompatibilität hoffe ich, dass dies bald irrelevant sein wird, da Microsoft nächste Woche die Unterstützung für ältere Versionen von IE einstellt !


Außerdem habe ich den wp_headersFilter ohne Verwendung der is_admin()Prüfung getestet und die admin_headers werden nicht geändert, sodass eine Prüfung nicht erforderlich ist.

Wenn Sie aus irgendeinem Grund die Admin-Header ä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);
Bryan Willis
quelle
2
Sie sollten weiterhin verwenden is_admin() || add_action( … ), da die Liste der registrierten Rückrufe nicht verschmutzt werden muss, wenn Sie sie nicht benötigen.
Fuxia
Interessanter Punkt toscho ... Ich mache seit ungefähr zehn Jahren WordPress-Sites und habe dieses Format noch nie gesehen, bevor ich das Symbol oder verwendet habe. Ich habe vor ein paar Jahren tatsächlich eine Frage gestellt, wie Bedingungen richtig formatiert werden können, wenn Sie diesen Ansatz hinzufügen möchten.
Bryan Willis
Toscho Ich habe meine Antwort auf Ihren Vorschlag aktualisiert. Ist es das, was du meintest?
Bryan Willis
Ja, sieht richtig aus. :)
Fuxia
" send_headersWürde jedes Mal gewinnen und sicherstellen, dass es geladen wird, auch wenn es nach dem send_headersZwischenspeichern der Seite hinzugefügt wird" - Nur um zu beachten, dass es nicht funktioniert, das von Plugins wie W3 Total Cache in meinen Tests verwendete Seiten-Caching oder statisches Caching zu übertreffen das umgeht WordPress effektiv auf Serverebene.
Nick