Eroare "headers already sent" de la un plugin WordPress
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 ""); echo '" - '; }
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
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ă.
