Ошибка "headers already sent" в WordPress плагине
У меня возникла проблема с ошибкой 'headers already sent' в WordPress плагине, который я дорабатываю. Вот сама ошибка:
Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent (output started at /home1/uname/directory/domain.com/wp-content/themes/ibm/header.php:2) in /home1/uname/directory/domain.com/wp-content/plugins/osu-rfm/osu-rfm.php on line 225
Я проверил header.php на строке 2 - там нет лишних пробелов или странных символов:
<!DOCTYPE html>
<!--[if lt IE 7 ]> <html class="ie ie6 no-js" <?php language_attributes(); ?>> <![endif]-->
<!--[if IE 7 ]> <html class="ie ie7 no-js" <?php language_attributes(); ?>> <![endif]-->
<!--[if IE 8 ]> <html class="ie ie8 no-js" <?php language_attributes(); ?>> <![endif]-->
<!--[if IE 9 ]> <html class="ie ie9 no-js" <?php language_attributes(); ?>> <![endif]-->
<!--[if gt IE 9]><!--><html class="no-js" <?php language_attributes(); ?>><!--<![endif]-->
<!-- класс "no-js" нужен для Modernizr. -->
<head id="osu-rfm" data-template-set="html5-reset-wordpress-theme" profile="http://gmpg.org/xfn/11">
<title>
<?php
if (function_exists('is_tag') && is_tag()) {
single_tag_title("Tag Archive for ""); echo '" - '; }
В строке 225 файла osu-rfm.php (это сам плагин) находится следующий код:
public static function enable_sessions()
{
if( is_post_type_archive( "ibmdirectory" ) || "ibmdirectory" == get_post_type() )
{
if( ! isset( $_SESSION ) )
/*
если заголовки уже отправлены (headers_sent($filename, $linenum)) {
//если заголовки уже отправлены - выводим сообщение
echo "Headers already sent in $filename on line $linenum\n";
} else {
//если заголовки еще не отправлены
echo "New headers";
}
*/
session_start();
}
}
Я зашел в тупик и не знаю, что попробовать дальше... Может кто-то подскажет? Я удалил все пробелы в начале и конце всех файлов темы как было предложено здесь, но это не помогло. Также пробовал убрать закрывающий тег ?>
в конце файла плагина - безрезультатно.
Кстати, эта ошибка возникает только на рабочем сервере, но не в локальном окружении, поэтому я подозреваю, что проблема может быть связана с сервером.
Спасибо
Osu
Если посмотреть исходный код страницы, вы увидите это примерно на строке 122:
<div class="nav-collapse collapse">
<br />
<b>Предупреждение</b>: session_start() [<a href='function.session-start'>function.session-start</a>]: Не удалось отправить cookie сессии - заголовки уже были отправлены (вывод начат в /home1/onesizeu/clients/instrumentalbackgroundmusic.com/wp-includes/functions.php:2841) в <b>/home1/onesizeu/clients/instrumentalbackgroundmusic.com/wp-content/plugins/osu-royaltfreemusic/osu-royaltyfreemusic.php</b> на строке <b>225</b><br />
<br />
<b>Предупреждение</b>: session_start() [<a href='function.session-start'>function.session-start</a>]: Не удалось отправить ограничитель кэша сессии - заголовки уже были отправлены (вывод начат в /home1/onesizeu/clients/instrumentalbackgroundmusic.com/wp-includes/functions.php:2841) в <b>/home1/onesizeu/clients/instrumentalbackgroundmusic.com/wp-content/plugins/osu-royaltfreemusic/osu-royaltyfreemusic.php</b> на строке <b>225</b><br />
<ul id="menu-primary" class="nav"><li id="menu-item-9" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-9"><a href="http://www.instrumentalbackgroundmusic.com/">Главная</a></li>
Что-то пытается запустить сессию уже в теле страницы. Так делать нельзя. Сессии должны быть запущены до того, как любой контент будет отправлен в браузер.
Исправление концептуально простое - нужно подключить функцию session_start
к какому-либо хуку, который выполняется до вывода контента. Например, так:
function boot_session() {
session_start();
}
add_action('wp_loaded','boot_session');
Я не знаю, что именно вызывает session_start
и почему, поэтому практическое исправление может быть сложнее, но это базовое решение.
