Ошибка "headers already sent" в WordPress плагине

5 июл. 2013 г., 17:14:37
Просмотры: 15.3K
Голосов: 0

У меня возникла проблема с ошибкой '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 &quot;"); echo '&quot; - '; }

В строке 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

7
Комментарии

Опубликуйте первые 10 или около того строк файла header.php

s_ha_dum s_ha_dum
5 июл. 2013 г. 17:17:58

Привет @s_ha_dum, спасибо за ответ - исходный вопрос обновлен, как вы просили

Osu Osu
5 июл. 2013 г. 17:22:35

Этот файл должен отправлять вывод. Это не проблема. Отключите режим отладки выключите. У вас все еще есть проблема?

s_ha_dum s_ha_dum
5 июл. 2013 г. 17:27:42

Вот как у меня настроена отладка в wp-config.php: define('WP_DEBUG', false); - я предполагаю, вы имели в виду это, а не php.ini?

Osu Osu
5 июл. 2013 г. 17:29:28

Каков URL основного сайта?

s_ha_dum s_ha_dum
5 июл. 2013 г. 17:32:25

http://www.instrumentalbackgroundmusic.com и вот пример страницы, на которой появляется ошибка: http://www.instrumentalbackgroundmusic.com/royalty-free-music/test-track-jazz-indie/

Osu Osu
5 июл. 2013 г. 17:34:04

давайте продолжим это обсуждение в чате

s_ha_dum s_ha_dum
5 июл. 2013 г. 17:46:15
Показать остальные 2 комментариев
Все ответы на вопрос 1
0

Если посмотреть исходный код страницы, вы увидите это примерно на строке 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 и почему, поэтому практическое исправление может быть сложнее, но это базовое решение.

5 июл. 2013 г. 18:04:33