Risolvere l'errore "headers already sent" da un plugin WordPress
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 ""); echo '" - '; }
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

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.
