wp_headers vs send_headers. Коли використовувати кожен?


10

Я бачив wp_headersі send_headersобидва раніше використовували для одних і тих же речей, і мені цікаво, як ви гадаєте знати, який саме використовувати і коли ...

На сторінці send_headersкодексу є приклад додавання 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
Взагалі кажучи, одне - це дія, а інше - фільтр. Дії - це робити щось, коли відбувається подія, а фільтр - для того, щоб щось змінити перед його використанням.
Міло

Відповіді:


9

Гаразд, я думаю, я зрозумів це ...

Обидва вони працюють здебільшого, як ви очікували, надсилаючи заголовки http / php до браузера. wp_headersнасправді є фільтром всередині send_headers()функцій. Ви можете використовувати це для зміни заголовків перед тим, як вони надсилаються до браузера за деяким винятком. wp_headersне зможе нічого зробити, якщо це статична сторінка з кешем ...

Тут грає send_headersгачок. Після wp_headersфільтра send_headers()функція перевіряє, чи Last-Modifiedбуло надіслано повідомлення, повідомляє нам, чи була сторінка кешована чи ні, а потім дозволяє нам зачепити її після кешування, типу вмісту тощо.

Тому для мого прикладу X-UA-Compatible, коли вони обидва працюють, я схильний використовувати send_headers. Чому? Один із них, якби ви додали обидва, send_headersвигравав би кожен раз і гарантував би, що він буде завантажений, навіть якщо його буде додано після кешування сторінки.

Хоча використання <meta>тега, як і багато популярних фреймворків , також працює для x-ua-сумісного, він не працюватиме у багатьох браузерах, якщо не завантажується майже одразу після відкриття тегу заголовка. Це викликано різними причинами, як, наприклад, якщо параметр "інтранет" встановлений в мережі . З цієї причини безпечніше використовувати метод php. Однак якби ви додали і те, і інше, мета-тег виграє (якщо вважати, що він включає досить рано.

Що стосується X-UA-Compatibleсумісності, то я сподіваюся, що це стане неактуальним незабаром, оскільки наступний тиждень Microsoft припиняє підтримку старих версій IE!


Крім того, я перевірив wp_headersфільтр, не використовуючи is_admin()перевірку, і він не змінить адмін_головок, щоб перевірка була непотрібною.

Якщо вам потрібно було чомусь змінити заголовки адміністратора, я знаю, що ви можете це зробити так, але я не впевнений, чи буде він працювати весь час ...

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( … ), оскільки немає потреби забруднювати список зареєстрованих зворотних дзвінків, якщо вони вам не потрібні.
фуксія

Цікавий момент Toscho ... Я вже десять років створюю сайти для WordPress і ніколи не бачив цього формату, перш ніж використовувати або символ. Я фактично задав питання про те, як правильно форматувати умови пару років тому, якщо ви хочете додати такий підхід.
Брайан Вілліс

Toscho Я оновив свою відповідь на основі вашої пропозиції. Це ви мали на увазі?
Брайан Вілліс

Так, виглядає правильно. :)
fuxia

" send_headersВигравав би кожен раз і гарантував би, що він буде завантажений, навіть якщо його буде додано після кешування сторінки" - Просто зауважте, що send_headersне працює, щоб перемогти кешування сторінок, використовувані плагінами, такими як W3 Total Cache в моїх тестах, або будь-яке статичне кешування що ефективно обходить WordPress на рівні сервера.
Нік
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.