Eroare "headers already sent" de la un plugin WordPress

5 iul. 2013, 17:14:37
Vizualizări: 15.3K
Voturi: 0

Am o problemă cu o eroare 'headers already sent' de la un plugin WordPress construit pentru mine și pe care acum îl adaptez. Iată eroarea:

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

Am verificat header.php la linia 2 și iată ce conține, fără spații suplimentare sau caractere ciudate:

<!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]-->
<!-- clasa "no-js" este pentru 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("Arhivă etichetă pentru &quot;"); echo '&quot; - '; }

Am verificat linia 225 în osu-rfm.php și iată secțiunea relevantă din acel fișier (acesta fiind plugin-ul):

public static function enable_sessions()
{
    if( is_post_type_archive( "ibmdirectory" ) || "ibmdirectory" == get_post_type() )
    {
        if( ! isset( $_SESSION ) )
    /*
    dacă(headers_sent($filename, $linenum)) {
        //dacă headerele au fost deja trimise, afișează un mesaj
        echo "Headere deja trimise în $filename la linia $linenum\n";
    } else {
        //dacă headerele nu au fost trimise
        echo "Headere noi";
    }
    */
        session_start();
    }
}

Și acum sunt complet blocat deoarece nu știu ce să încerc în continuare... are cineva sugestii? Am eliminat toate spațiile de la sfârșit și început în toate fișierele temei așa cum se sugerează aici, dar nu pare să facă diferența. Am încercat și eliminarea tag-ului de închidere ?> de la sfârșitul fișierului plugin-ului, dar fără succes.

Apropo, această problemă apare doar pe serverul live, nu și în configurația locală, așa că am senzația că ar putea fi o problemă de server.

Mulțumesc,

Osu

7
Comentarii

Postează primele aproximativ 10 linii din header.php

s_ha_dum s_ha_dum
5 iul. 2013 17:17:58

Salut @s_ha_dum, mulțumesc pentru răspuns - întrebarea originală a fost actualizată conform cerinței

Osu Osu
5 iul. 2013 17:22:35

Acest fișier ar trebui să trimită output. Nu asta e problema. Dezactivează debugging-ul complet. Mai ai problema?

s_ha_dum s_ha_dum
5 iul. 2013 17:27:42

Așa am configurat depanarea în wp-config.php : define('WP_DEBUG', false); - presupun că te refereai la asta și nu la php.ini?

Osu Osu
5 iul. 2013 17:29:28

Care este URL-ul site-ului live?

s_ha_dum s_ha_dum
5 iul. 2013 17:32:25

http://www.instrumentalbackgroundmusic.com și acesta este un exemplu de pagină care afișează eroarea: http://www.instrumentalbackgroundmusic.com/royalty-free-music/test-track-jazz-indie/

Osu Osu
5 iul. 2013 17:34:04

hai să continuăm această discuție în chat

s_ha_dum s_ha_dum
5 iul. 2013 17:46:15
Arată celelalte 2 comentarii
Toate răspunsurile la întrebare 1
0

Dacă te uiți la sursa paginii, vei vedea acest lucru în jurul liniei 122:

<div class="nav-collapse collapse">
                    <br />
<b>Avertisment</b>:  session_start() [<a href='function.session-start'>function.session-start</a>]: Nu se poate trimite cookie-ul de sesiune - antetele au fost deja trimise (output început la /home1/onesizeu/clients/instrumentalbackgroundmusic.com/wp-includes/functions.php:2841) în <b>/home1/onesizeu/clients/instrumentalbackgroundmusic.com/wp-content/plugins/osu-royaltfreemusic/osu-royaltyfreemusic.php</b> la linia <b>225</b><br />
<br />
<b>Avertisment</b>:  session_start() [<a href='function.session-start'>function.session-start</a>]: Nu se poate trimite limitatorul de cache pentru sesiune - antetele au fost deja trimise (output început la /home1/onesizeu/clients/instrumentalbackgroundmusic.com/wp-includes/functions.php:2841) în <b>/home1/onesizeu/clients/instrumentalbackgroundmusic.com/wp-content/plugins/osu-royaltfreemusic/osu-royaltyfreemusic.php</b> la linia <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/">Acasă</a></li>

Ceva încearcă să inițieze o sesiune în mijlocul corpului paginii. Nu poți face asta. Sesiunile trebuie să fie inițiate înainte de a trimite orice conținut către browser.

Soluția pentru această problemă este conceptual simplă - atașează funcția session_start la un hook care rulează înainte de afișarea conținutului. Ceva de genul:

function boot_session() {
  session_start();
}
add_action('wp_loaded','boot_session');

Nu știu exact ce apelează session_start sau de ce, așa că soluția practică poate fi mai complicată, dar aceasta este soluția de bază.

5 iul. 2013 18:04:33