Obteniendo error de headers already sent desde un plugin
Estoy teniendo problemas con un error 'headers already sent' de un plugin de WordPress que me hicieron y ahora estoy adaptando. Este es el error:
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
He revisado el header.php en la línea 2 y esto es lo que hay allí, sin espacios en blanco adicionales ni caracteres extraños:
<!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 clase "no-js" es para 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("Archivo de etiqueta para ""); echo '" - '; }
He revisado la línea 225 en osu-rfm.php y esto es parte de ese archivo (este es el plugin por cierto):
public static function enable_sessions()
{
if( is_post_type_archive( "ibmdirectory" ) || "ibmdirectory" == get_post_type() )
{
if( ! isset( $_SESSION ) )
/*
si(headers_sent($filename, $linenum)) {
//si los headers ya fueron enviados, imprimir algún mensaje
echo "Headers ya enviados en $filename en la línea $linenum\n";
} else {
//si los headers no han sido enviados
echo "Nuevos headers";
}
*/
session_start();
}
}
Y ahora estoy completamente atascado porque no sé qué intentar a continuación... ¿alguien puede hacer algunas sugerencias? Eliminé todos los espacios en blanco al final y al principio en todos mis archivos de tema como se sugiere aquí, pero no parece hacer diferencia. También intenté eliminar la etiqueta de cierre ?>
al final de mi archivo de plugin, pero nada.
Por cierto, esto solo ocurre en mi servidor en vivo, no en mi configuración local, así que tengo la sensación de que podría ser un problema del servidor.
Gracias
Osu

Si miras el código fuente de la página verás esto alrededor de la línea 122:
<div class="nav-collapse collapse">
<br />
<b>Advertencia</b>: session_start() [<a href='function.session-start'>function.session-start</a>]: No se puede enviar la cookie de sesión - las cabeceras ya fueron enviadas por (output started at /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> on line <b>225</b><br />
<br />
<b>Advertencia</b>: session_start() [<a href='function.session-start'>function.session-start</a>]: No se puede enviar el limitador de caché de sesión - las cabeceras ya fueron enviadas (output started at /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> on line <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/">Inicio</a></li>
Algo está intentando iniciar una sesión bien dentro del cuerpo de la página. No puedes hacer eso. Las sesiones deben iniciarse antes de que se envíe cualquier contenido al navegador.
La solución para esto es conceptualmente simple - enganchar la función session_start
a algún hook que se ejecute antes de que se imprima el contenido. Algo como esto:
function boot_session() {
session_start();
}
add_action('wp_loaded','boot_session');
No sé exactamente qué está llamando a session_start
o por qué, por lo que la solución práctica puede ser más complicada, pero esa es la solución básica.
