Risolvere l'errore "headers already sent" da un plugin WordPress

5 lug 2013, 17:14:37
Visualizzazioni: 15.3K
Voti: 0

Sto avendo problemi con un errore 'headers already sent' da un plugin WordPress che mi è stato sviluppato e che ora sto adattando. Questo è l'errore:

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

Ho controllato la riga 2 di header.php e questo è ciò che c'è, senza spazi bianchi extra né caratteri strani:

<!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]-->
<!-- la classe "no-js" è per 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("Archivio tag per &quot;"); echo '&quot; - '; }

Ho controllato la riga 225 in osu-rfm.php e questa è parte del file (questo è il plugin tra l'altro):

public static function enable_sessions()
{
    if( is_post_type_archive( "ibmdirectory" ) || "ibmdirectory" == get_post_type() )
    {
        if( ! isset( $_SESSION ) )
    /*
    if(headers_sent($filename, $linenum)) {
        //se gli header sono già stati inviati stampa un messaggio
        echo "Headers already sent in $filename on line $linenum\n";
    } else {
        //se gli header non sono stati ancora inviati
        echo "New headers";
    }
    */
        session_start();
    }
}

E ora sono completamente bloccato perché non so cosa provare dopo...qualcuno può darmi qualche suggerimento? Ho rimosso tutti gli spazi bianchi alla fine e all'inizio in tutti i file del tema come suggerito qui, ma non sembra fare differenza. Ho anche provato a rimuovere il tag di chiusura ?> alla fine del mio file del plugin, ma nulla.

A proposito, questo succede solo sul mio server live, non sul mio ambiente locale, quindi ho la sensazione che potrebbe essere un problema del server.

Grazie

Osu

7
Commenti

Pubblica le prime 10 righe circa di header.php

s_ha_dum s_ha_dum
5 lug 2013 17:17:58

Ciao @s_ha_dum grazie per la risposta - domanda originale aggiornata come richiesto

Osu Osu
5 lug 2013 17:22:35

Quel file dovrebbe inviare output. Non è quello il problema. Disattiva il debug adesso. Hai ancora il problema?

s_ha_dum s_ha_dum
5 lug 2013 17:27:42

Ecco come ho impostato il debug nel mio wp-config.php: define('WP_DEBUG', false); - presumo ti riferissi a questo piuttosto che a php.ini?

Osu Osu
5 lug 2013 17:29:28

Qual è l'URL del sito live?

s_ha_dum s_ha_dum
5 lug 2013 17:32:25

continuiamo questa discussione in chat

s_ha_dum s_ha_dum
5 lug 2013 17:46:15
Mostra i restanti 2 commenti
Tutte le risposte alla domanda 1
0

Se guardi il codice sorgente della pagina vedrai questo intorno alla riga 122:

<div class="nav-collapse collapse">
                    <br />
<b>Avviso</b>:  session_start() [<a href='function.session-start'>function.session-start</a>]: Impossibile inviare il cookie di sessione - gli header sono già stati inviati (output iniziato in /home1/onesizeu/clients/instrumentalbackgroundmusic.com/wp-includes/functions.php:2841) in <b>/home1/onesizeu/clients/instrumentalbackgroundmusic.com/wp-content/plugins/osu-royaltfreemusic/osu-royaltyfreemusic.php</b> alla riga <b>225</b><br />
<br />
<b>Avviso</b>:  session_start() [<a href='function.session-start'>function.session-start</a>]: Impossibile inviare il limitatore di cache della sessione - gli header sono già stati inviati (output iniziato in /home1/onesizeu/clients/instrumentalbackgroundmusic.com/wp-includes/functions.php:2841) in <b>/home1/onesizeu/clients/instrumentalbackgroundmusic.com/wp-content/plugins/osu-royaltfreemusic/osu-royaltyfreemusic.php</b> alla riga <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/">Home</a></li>

Qualcosa sta cercando di avviare una sessione ben all'interno del corpo della pagina. Non puoi farlo. Le sessioni devono essere avviate prima che qualsiasi contenuto venga inviato al browser.

La soluzione per questo è concettualmente semplice - agganciare la funzione session_start a qualche hook che viene eseguito prima che il contenuto venga stampato. Qualcosa come questo:

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

Non so esattamente cosa stia chiamando session_start o perché, quindi la soluzione pratica potrebbe essere più complicata ma questa è la soluzione di base.

5 lug 2013 18:04:33