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 ...


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

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.