wp_headers vs send_headers. Kiedy używać każdego z nich?

10

Widziałem wp_headersi send_headersużyłem wcześniej tego samego i zastanawiam się, skąd masz wiedzieć, którego użyć i kiedy ...

Na stronie send_headerskodeksu znajduje się przykład dodania X-UA-Compatible: IE=edge,chrome=1wstecznej kompatybilności dla Internet Explorera, ponieważ metatag często zawodzi w witrynach intranetowych, jeśli jest ładowany zbyt późno .

Oto send_headersjak wygląda przykład:

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

Jednak wp_headersmoże to również zrobić:

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

Aktualizacja: Właściwie właśnie zauważyłem, że rozmowa na ten temat mniej więcej rozpoczęła się na podobne pytanie kilka lat temu ...

Ponadto, czy send_headers ma związek tylko z interfejsem? Widziałem wp_headers wykonujący takie kontrole:

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

i

if (!is_admin()) 

więc myślę, że może send_headersnie muszę przeprowadzać tych kontroli ...

Bryan Willis
źródło
1
Ogólnie rzecz biorąc, jedno jest działaniem, a drugie jest filtrem. Akcje służą do robienia czegoś, gdy wystąpi zdarzenie, a filtr służy do modyfikowania czegoś przed jego użyciem.
Milo,

Odpowiedzi:

9

Ok, więc myślę, że to rozgryzłem ...

Oba działają w przeważającej części, jak można się spodziewać, wysyłając nagłówki http / php do przeglądarki. wp_headersjest właściwie filtrem wewnątrz send_headers()funkcji. Możesz go użyć do modyfikacji nagłówków, zanim zostaną one wysłane do przeglądarki, z pewnym wyjątkiem. wp_headersnie będzie w stanie nic zrobić, jeśli chodzi o statyczną stronę w pamięci podręcznej, z którą ...

Tutaj zaczyna się send_headershak. Po wp_headersfiltrze send_headers()funkcja sprawdza, czy Last-Modifiedzostała wysłana, informuje nas, czy strona została zbuforowana, czy nie, a następnie pozwala nam się podłączyć do niej po wysłaniu buforowania, rodzaju zawartości itp.

Więc w moim przykładzie X-UA-Compatible, podczas gdy oba działają, jestem skłonny do użycia send_headers. Dlaczego? Po pierwsze, gdyby dodać oba, send_headerswygrałby za każdym razem i zapewniłby, że zostanie załadowany, nawet jeśli zostanie dodany po buforowaniu strony.

Chociaż użycie <meta>tagu, którego używa wiele popularnych frameworków , działałoby również w przypadku kompatybilności z x-ua, nie będzie działać w wielu przeglądarkach, chyba że zostanie załadowane prawie natychmiast po otwierającym tagu head. Jest to spowodowane różnymi przyczynami, np. Jeśli ustawienie „intranet” jest ustawione dla całej sieci . Z tego powodu korzystanie z metody php jest bezpieczniejsze. Jeśli jednak dodasz oba, metatag wygra (zakładając, że zawiera on odpowiednio wcześnie).

Jeśli chodzi o X-UA-Compatiblekompatybilność, mam nadzieję, że wkrótce nie będzie to miało znaczenia, ponieważ Microsoft rezygnuje z obsługi starszych wersji IE w przyszłym tygodniu!


Testowałem również wp_headersfiltr bez użycia is_admin()czeku i nie zmodyfikuje on nagłówków admin_head, więc sprawdzenie nie będzie konieczne.

Jeśli z jakiegoś powodu musiałeś zmodyfikować nagłówki administratora, wiem, że możesz to zrobić w ten sposób, ale nie jestem pewien, czy to działałoby cały czas ...

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

Zaktualizowana odpowiedź na podstawie sugestii Toscho, aby sprawdzić administratora:

is_admin() || add_action('send_headers', function(){ 
    header('X-UA-Compatible: IE=edge,chrome=1'); 
}, 1);
Bryan Willis
źródło
2
Nadal powinieneś używać is_admin() || add_action( … ), ponieważ nie ma potrzeby zanieczyszczania listy zarejestrowanych wywołań zwrotnych, jeśli nie są potrzebne.
fuxia
Ciekawe toscho punktowe ... Tworzę strony Wordpress od około dziesięciu lat i nigdy nie widziałem tego formatu przed użyciem symbolu lub. Kilka lat temu faktycznie zadałem pytanie, jak prawidłowo sformatować warunki, jeśli masz ochotę dodać to podejście.
Bryan Willis
Toscho Zaktualizowałem odpowiedź na podstawie Twojej sugestii. Czy o to ci chodziło?
Bryan Willis
Tak, wygląda dobrze. :)
fuxia
send_headersWygrywa za każdym razem i zapewnia, że ​​zostanie załadowany, nawet jeśli zostanie dodany po buforowaniu strony” - wystarczy zauważyć, że send_headersnie działa, aby pobić buforowanie strony używane przez wtyczki takie jak W3 Total Cache w moich testach lub jakiekolwiek buforowanie statyczne który skutecznie omija WordPress na poziomie serwera.
Nick