Obteniendo error de headers already sent desde un plugin

5 jul 2013, 17:14:37
Vistas: 15.3K
Votos: 0

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 &quot;"); echo '&quot; - '; }

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

7
Comentarios

Publica las primeras 10 líneas aproximadamente del archivo header.php

s_ha_dum s_ha_dum
5 jul 2013 17:17:58

Hola @s_ha_dum gracias por responder - la pregunta original ha sido actualizada como solicitaste

Osu Osu
5 jul 2013 17:22:35

Ese archivo debería estar enviando salida. Ese no es el problema. Desactiva el modo de depuración ahora. ¿Sigues teniendo el problema?

s_ha_dum s_ha_dum
5 jul 2013 17:27:42

Así es como tengo configurada la depuración en wp-config.php: define('WP_DEBUG', false); - ¿Supongo que te refieres a eso en lugar de php.ini?

Osu Osu
5 jul 2013 17:29:28

¿Cuál es la URL del sitio en vivo?

s_ha_dum s_ha_dum
5 jul 2013 17:32:25

continuemos esta discusión en el chat

s_ha_dum s_ha_dum
5 jul 2013 17:46:15
Mostrar los 2 comentarios restantes
Todas las respuestas a la pregunta 1
0

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.

5 jul 2013 18:04:33