Перейти к публикации
iCast

Cannot modify header information. WordPress

Рекомендованные сообщения

iCast

Доброго времени суток! Столкнулся с такой проблемой, с редиректами.
Функцией wp_safe_redirect() делаю редирект на главную страницу.
 
 

wp_safe_redirect("/?mode=status&success=0&n=1);

 
Но почему выскакивает предупреждение:
 
 

Warning: Cannot modify header information - headers already sent by (output started at /home/site/data/www/site.ru/wp-content/themes/site/header.php:115) in /home/site/data/www/site.ru/wp-includes/pluggable.php on line 1121

В файле header.php вроде бы никаких заголовков функцией Header() не отправляю. В файле используются html вставки.
header.php

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" <?php language_attributes(); ?>>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title><?php wp_title(); ?></title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="<?php echo get_template_directory_uri(); ?>/style.css?ver=1.0" type="text/css" media="all" />
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
<script type="text/javascript" src="<?php echo get_template_directory_uri(); ?>/js/site.min.js?ver=1.0"></script>
<script type="text/javascript" src="//vk.com/js/api/openapi.js?98"></script>
<script type="text/javascript">VK.init({apiId: 1, onlyWidgets: true});</script>
<style type="text/css">
<body<?php body_class(); ?>>
<?php
if(is_user_logged_in()) {
$current_user = wp_get_current_user();
?>
<div>
.....

<?php
if(!$current_user->token){?>
<script type="text/javascript">
....

else {
?>
<div class="navbar navbar-default" role="navigation">
...

 
Вот примерно такая структура. Вот 115 строка:
 

.... </ul>
</div><!--/.nav-collapse -->
</div>
</div>


[115 строка]<?php
if(!$current_user->token){?>
<script type="text/javascript">
$(window).load(function(){
$('#static').modal({
backdrop: 'static',
keyboard: false});
});
</script>
<div class="
...

 
Помогите решить проблему.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
TheAndrey

Сначала идут заголовки, а только потом выводится само "тело" страницы. Т.е. никаких операторов/функций вывода не должно быть перед функциями отправки заголовков.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
iCast

@Andrey, т.е. где то заголовки высылаются позже загрузки header.php? или их вообще  нет?
что то не пойму никак я с этими заголовками 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
TheAndrey

 

Andrey, т.е. где то заголовки высылаются позже загрузки header.php

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
iCast

@Andrey, почему же тогда на эту строку не ругается?
 

<title><?php wp_title(); ?></title>

или эту?

<html xmlns="http://www.w3.org/1999/xhtml" <?php language_attributes(); ?>>

Они же раньше прописаны.



вот еще что заметил. если удаляю из файла status.php (откуда идет редирект) функцию get_header() (выводит header.php), то редирект работает нормально, но удаляются все стили, ну грубо говоря не подкючается header сайта.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
WooFi

Заголовки веб-страницы и заголовки в разделе head - это две разные вещи, не путай их.

Первые должны быть обязательно отправлены до того, как ты отправишь тело документа (HTML код, проще говоря)

Если ты редирект высылаешь после загрузки функцией get_header(), то ошибка очевидна, перемещай редирект выше.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
iCast

@WooFi, ага, все понятно. а нельзя как нибудь избавиться от этого? если убрать скрипт до вывоза get_header() то нарушается конструкция скрипта, если убрать функцию, то стили теряю. 
Нашел такой вариант: http://tommcfarlin.com/wp_redirect-headers-already-sent/

function app_output_buffer() {
	ob_start();
} // soi_output_buffer
add_action('init', 'app_output_buffer');

 

Но я не думаю что это лучшее решение...

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
WooFi

Да, решение не лучшее, но если ты говоришь, что нарушается конструкция, то иначе как-то сделать не получится. С другой стороны, эту логику надо переписать, что там такое экзотическое, что вывод каким-то боком идет посередине логики скрипта?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
iCast

@WooFi, там стоит условие, если что-то что-то, то вывести одну форму и редирект на страницу с одними GET-параметрами, иначе с другими параметрами. то есть переплетается HTML с PHP. И я не понимаю пока что как исправить это...


Нашел еще такой вариант: http://www.lessthanweb.com/blog/wordpress-and-wp_redirect-function-problem
Стоит ли его использовать?


Спасибо всем кто поддержл тему, особенно @WooFi. Решил проблему так (по началу ступил). Я вынес обработчик post формы выше вызова get_header(), а условие какую форму мне вывести оставил.
То есть на будущее оставлю в качестве примера отрывки кода:

Есть файл status.php, в нем делаем редирект

 

....
if(isset($_POST['off']))
    {

wp_safe_redirect("/?mode=status&success=0");
    }


    if(isset($_POST['on']))
    {

wp_safe_redirect("/?mode=status&success=1");
    }
get_header();

.....

if($mode=="off") {

?>
<center>
<form accept-charset="UTF-8" method="post">
   <p><button name="off" class="btn btn-small btn-primary" type="submit">Выключить</button>
   <a href="/" class="btn btn-small">Отмена</a></p>
</form>
</center>
<?php
}
else {

?>
<center>
<form accept-charset="UTF-8" method="post">
   <p><button name="on" class="btn btn-small btn-primary" type="submit">Включить</button>
   <a href="/" class="btn btn-small">Отмена</a></p>
</form>
</center>
<?php
}
?>

Прошу модераторов закрыть тему.

Изменено пользователем iCast

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Гость
Эта тема закрыта для публикации сообщений.

×
×
  • Создать...