Одной из распространенных ошибок, которая возникает при работе сайта на WordPress является "Cannot modify header information - headers already sent", или "Невозможно изменить информацию о заголовке - заголовки уже отправлены".
В общем ошибка выглядит так:
Warning: Cannot modify header information - headers already sent by (output started at /home/hadver/arto.agency/wp/wp-includes/script-loader.php:2838) in /home/hadver/arto.agency/wp/wp-content/themes/kadence/header.php on line 29.

Поскольку это ошибка уровня Warning, то она не должна приводить к "белому экрану смерти", но сам факт ее появления является результатом неправильной работы сайта.
TL;DR. Данная ошибка возникает тогда, когда заголовки ответа HTTP по разным причинам начинают выводиться после того, как был осуществлен вывод тела ответа. Ниже мы более подробно описали это. Если же вы хотите сразу узнать о том, как исправить эту ошибку, то перейдите к этой секции.
Столкнулись с этой ошибкой?
Что такое HTTP-ответ?
Веб-сервер взаимодействует с клиентом (браузером) посредством протокола HTTP. Согласно этому протоколу ответ, который посылается клиенту, состоит из двух частей: заголовков (headers) и тела (body).
Тело, в большинстве случаев, является видимой частью. Это как раз и есть та самая страница веб-сайта, которую мы просматриваем в браузере. А вот заголовки без применения специальных программных инструментов невозможно увидеть.
Для чего нужны заголовки HTTP-ответа?
Заголовки HTTP-ответа являются простыми строками текста, которые могут содержать не только служебную информацию о странице, но и предоставлять определенные указания клиенту относительно нее. Они состоят из двух частей: названия заголовка и его значения. Их используют для различных целей, в частности:
- предоставления информации о веб-странице: например ее кодировке и MIME типе контента;
- управления кэшированием страницы и связанных с ней ресурсов;
- перенаправления браузера на другой адрес;
- управления файлами cookies;
- отказа в доступе и т.д.
В чем же причина ошибки?
В соответствии с протоколом HTTP, заголовки всегда должны предшествовать телу ответа. Если же этот порядок нарушается, то есть заголовки начинают отправляться, когда уже начался фактический вывод тела, тогда и возникает ошибка "Cannot modify header information".
Однако, следует заметить, что сайты на Wordpress, как и другие сайты на php, имеют встроенный механизм буферизации вывода. Это означает, что тело ответа сначала может записываться в буфер, а не напрямую выводиться клиенту. В таком случае, даже если заголовки отправятся после вывода тела, ошибка может и не возникнуть. Однако если буфер переполнится, или будет очищен принудительно до вывода заголовков, то принцип их первенства нарушится, и появится ошибка.
Для упрощения, в дальнейшем мы будем пренебрегать механизмом буферизации.
Наиболее распространенные причины ошибки "Cannot modify header information"
Пробелы или символы табуляции перед открывающим тегом <?php
Одна из распространенных причин ошибки - наличие пробельных символов перед открывающим тегом <?php в php файлах. Несмотря на то, что пробел никак не визуализируется, сервер считает его началом вывода тела ответа. Соответственно, если после этого пробела где-то начинают выводиться заголовки, то появляется ошибка.

Стрелка указывает на символ табуляции, который находится перед открывающим тегом <?php в самом начале файла.
Выражения echo или print перед отправкой заголовков
Аналогично предыдущему случаю, если перед отправкой заголовков есть явный вывод данных с помощью выражений echo или print, то это может привести к ошибке.

Стрелка 1 указывает на вывод текста с помощью конструкции echo. Обратите внимание, что ниже находится функция (стрелка 2), которая отправляет заголовки.
Вывод html блока перед отправкой заголовков
Вывод HTML-кода перед отправкой заголовков является еще одной причиной этой проблемы. Такие случаи встречаются в файлах шаблонов Wordpress или частях шаблонов, где может быть большое количество разметки, и где организовывать вывод заголовков, с программной точки зрения, не является уместным.

Стрелка 1 указывает на вывод html кода. Ниже происходит (стрелка 2) отправка заголовков.
Поздняя попытка установки cookies
Поскольку cookies отправляются с сервера как заголовки, то попытка их установки уже после начала вывода тела, также может привести к появлению ошибки. В данном случае, как и предыдущем, отправка cookies пользователю должна быть запрограммирована на более ранних этапах работы веб-приложения, до вывода html.

Стрелка указывает попытку установки cookies после вывода html кода
Поздний запуск php сессии
Сессии являются отличным механизмом обеспечения качественного взаимодействия веб-приложения и клиента. Без них трудно представить функционирование корзины в интернет-магазинах, вишлистов и других модулей, для которых нужно удерживать определенную информацию на время работы клиента с сайтом.
Если для управления сессиями на сайте используются встроенные возможности php, то, наиболее вероятно, запуск сессии будет осуществлен функцией session_start(). И здесь важно понимать одну вещь - для идентификации клиента сессии ему должны отправиться соответствующие cookies, а они, как мы уже выяснили, устанавливаются через заголовки. Поэтому если пытаться запустить сессию после того, как вывод тела уже начался, то это приведет к несколько иной по формулировке, но похожей по своей сути ошибке "Session_start(): Cannot start session when headers already sent in /home/hadver/arto.agency/wp/wp-content/themes/kadence/header.php on line 33".

При этом, код, который привел к такой ситуации может быть примерно таким:

Стрелка указывает на запуск сессии после вывода html кода
Как исправить ошибку Cannot modify header: 4 способа
Для исправления ошибки нужно внести изменения в php файл, в котором она появилась. Но как понять, какой из сотен, а то и тысяч файлов сайта, стоит отредактировать? Все не так уж и сложно: стоит еще раз внимательно прочитать текст ошибки:
Warning: Cannot modify header information - headers already sent by (output started at /home/hadver/arto.agency/wp/wp-includes/script-loader.php:2838) in /home/hadver/arto.agency/wp/wp-content/themes/kadence/header.php on line 33.
Этот текст говорит нам о том, что вывод тела начат в файле script-loader.php на 2838-й строчке (output started at /home/hadver/arto.agency/wp/wp-includes/script-loader.php:2838), а заголовки после начала вывода тела пытается отправить файл header.php на строке 33.
Исходя из того, что мы узнали ранее в этой статье, наиболее вероятно, что редактировать придется файл script-loader.php. Возможно, там есть пробельный символ, незапланированный вывод html контента и т.д. Обратите внимание, что в тексте ошибки показаны полные абсолютные пути расположения файлов. Эта информация будет нам необходима при дальнейших шагах.
Давайте рассмотрим теперь, как мы можем самостоятельно отредактировать проблемный файл (-ы).
Редактирование через редактор темы в админке
Если ошибка возникает в файлах темы, и админ панель вашего веб сайта работает, перейдите в нее и откройте редактор темы и найдите файл и строчку в нем, где возникла ошибка. Проанализируйте этот участок кода и при необходимости удалите любые лишние символы, которые начинают вывод тела ответа. После этого сохраните изменения и проверьте, выводится ли сообщение об ошибке.
Редактирование через FTP (Filezilla)
Если доступ к админ-панели невозможен или файл не находится в теме, вы можете отредактировать файл через FTP-клиент, например, FileZilla. Для этого вы должны узнать данные доступа к серверу по протоколу FTP. Вы можете найти их в панели управления хостингом/сервером. Введите логин и пароль, соединитесь с вашим сервером, найдите соответствующий файл по его пути, который указан в тексте ошибки, внесите изменения и сохраните их.
Переустановка или обновление плагина
Еще раз обратите внимание на абсолютный путь к файлу с ошибкой. Если вы увидите там /wp-content/plugins/, то ошибка вероятно связана с определенным плагином. Сразу после строчки /wp-content/plugins/ будет идти название папки плагина, по которой можно догадаться, как собственно плагин называется. Если у вас в работает админ-панель, то попробуйте просто обновить плагин, ведь если ошибка возникла по вине его разработчиков, то они, скорее всего, о ней уже знают и выпустили фикс. Если же плагин не имеет обновления, то можно наоборот попробовать откатить его, понизив версию. Если и это проблематично или админ-панель не работает, то придется исправлять ошибку вручную через FTP, как было описано выше.
Восстановление из бэкапа
Если у вас есть резервная копия файлов сайта, созданная до возникновения ошибки, можно попробовать восстановиться из нее. Этот способ может быть действенным, если надо все сделать здесь и сейчас, и если у вас нет достаточно возможностей изучать файлы на вашем сервере.
Возможно вам нужна наша помощь?
Вместо заключения
Исправление ошибки "Cannot modify header information" не является чем-то сложным, главное правильно понять ее и внести соответствующие коррективы в файлы. Несмотря на это, иногда могут возникать более сложные ситуации, когда причиной появления ошибки является не случайное начало вывода тела, а ошибочно написанный код: неправильно инициализированная сессия или установка файлов cookies (как было описано выше) и т.д. В таком случае стоит изучать программную логику сайта и проводить более глубокий рефакторинг, который потребует привлечения квалифицированных специалистов.
