Проблема перенаправления Wordpress, заголовки уже отправлены

Мне интересно, основываясь на приведенном ниже коде, куда бы я хотел поместить свою функцию wp_redirect, потому что там, где она сейчас находится, ничего не происходит, а просто вылетает и говорит:

 Warning: Cannot modify header information - headers already sent by (output started at /***/***/WordPress/WordPressDev/wp-includes/script-loader.php:664) in /***/***/WordPress/WordPressDev/wp-includes/pluggable.php on line 881

Что я получаю, потому что страница уже загружена. но я не уверен, где вызвать эту функцию.

Я заменил свой веб-сайт и любые «личные данные» на звезды и example.com. Как бы этот код ни работал, он просто не перенаправит меня.

мысли?

function get_latest_version_zip(){
             global $wp_filesystem;

             if(current_user_can('update_themes')){
                $aisis_file_system_structure = WP_Filesystem();
                $aisis_cred_url = 'admin.php?page=aisis-core-update';
                if($aisis_file_system_structure == false){
                    request_filesystem_credentials($aisis_cred_url);
                    $this->credential_check = true;
                }

                $aisis_temp_file_download = download_url( 'http://example.com/aisis/aisis_update/Aisis2.zip' );

                if(is_wp_error($aisis_temp_file_download)){
                    $error = $aisis_temp_file_download->get_error_code();
                    if($error == 'http_no_url') {
                        add_action( 'admin_notices', 'aisis_framework_download_update_erors' );
                    }
                }

                $aisis_unzip_to = $wp_filesystem->wp_content_dir() . "/themes/" . get_option('template');

                $this->delete_contents_check(); //Check if we need to delete the aisis core folder.

                $aisis_do_unzip = unzip_file($aisis_temp_file_download, $aisis_unzip_to);

                unlink($aisis_temp_file_download); //delete temp jazz

                if(is_wp_error($aisis_do_unzip)){
                    $error = $aisis_do_unzip->get_error_code();
                    if($error == 'incompatible_archive') {
                        $this->aisis_incompatible_archive_errors();
                    }
                    if($error == 'empty_archive') {
                        $this->aisis_empty_archive_errors();
                    }
                    if($error == 'mkdir_failed') {
                        $this->aisis_mkdir_failed_errors();
                    }
                    if($error == 'copy_failed') {
                        $this->aisis_copy_failed_errors();
                    }
                    return;
                }
                //throwing errors
                wp_redirect(admin_url('admin.php?page=aisis-core-options'));
                exit;

             }
         }

в моем файле functions.php я разместил следующий код:

 function callback($buffer){
     return $buffer;
 }

 function add_ob_start(){
     ob_start("callback");
 }

 function flush_ob_end(){
     ob_end_flush();
 }

 add_action('wp_head', 'add_ob_start');
 add_action('wp_footer', 'flush_ob_end');

с этим я все еще получаю сообщение об ошибке, я думаю, что я что-то недопонимаю....


person TheWebs    schedule 26.09.2012    source источник


Ответы (3)


Просто замените следующую строку

add_action('wp_head', 'add_ob_start');

с

add_action('init', 'add_ob_start');

Буферизация вывода должна начинаться до того, как что-либо будет отправлено/отправлено в браузер, а перехватчик wp_head произойдет немного позже, чем перехватчик init, и до этого момента уже отправленные заголовки, а также сохраните/разместите его в верхней части вашего functions.php до того, как что-либо будет отправлено/отправлено в браузер.

person The Alpha    schedule 26.09.2012
comment
заголовки, уже отправленные (вывод начался в /***/***/WordPress/WordPressDev/wp-includes/script-loader.php:664) в /***/***/WordPress/WordPressDev/wp-includes /pluggable.php в строке 881 - person TheWebs; 27.09.2012
comment
Честно говоря, я использую тот же код на своем сайте WordPress, и он работает нормально. Я просто использовал крючок init вместо wp_head. - person The Alpha; 27.09.2012
comment
использование «init» остановило ошибку, но код не запустился. - person Paul McCarthy; 17.12.2019

Проблема в том, что где-то в wordpress была вызвана функция header(), и некоторый вывод уже был отправлен клиенту, пока output buffering выключен.

Заголовки должны быть отправлены до любого вывода, иначе вы получите описанную вами ошибку.

wp_redirect(admin_url('admin.php?page=aisis-core-options'));

Приведенная выше строка устанавливает заголовок следующим образом: header('Location: admin.php......');

Включение буферизации вывода через php.ini, в index.php wordpress или просто до того, как что-либо будет передано клиенту, должно позаботиться об ошибке.

Подробности/документацию можно найти здесь: http://php.net/manual/en/book.outcontrol.php

самый простой способ, который я могу придумать, это сделать ваш wordpress index.php таким:

ob_start();
// content of your index.php here
ob_flush();
person Gung Foo    schedule 26.09.2012
comment
когда вы говорите мой индексный файл WordPress, что вы имеете в виду? ядро?, та, что в каталоге тем, или та, что в моей теме? насколько я знаю, существует множество индексных файлов WP. - person TheWebs; 26.09.2012
comment
точка входа, насколько я понимаю, это тема index.php, поэтому я проверю это и отчитаюсь - person TheWebs; 26.09.2012
comment
это не сработало. Единственное другое место, о котором я могу думать, это файлы ядра WordPress, но поскольку они обновляются при обновлении WordPress, вы знаете, что их нельзя трогать. - person TheWebs; 26.09.2012
comment
dagondesign.com/articles/ - person Gung Foo; 27.09.2012
comment
Можете ли вы объяснить этот мир относительно того, что я должен с ним делать? или если мне это нужно в моем случае function callback($buffer) { // изменить здесь буфер, а затем вернуть обновленный код return $buffer; } - person TheWebs; 27.09.2012
comment
просто используйте его без комментариев.. это позволит вам изменить вывод веб-сайта до того, как он будет отправлен клиенту - person Gung Foo; 27.09.2012
comment
так что мне на самом деле не нужно заполнять метод чем-либо? потому что из того, что я читаю, я бы вызвал этот метод и передал бы ему перенаправление как $buffer, поэтому callback(wp_redirect('отвезите меня в тюрьму')); - person TheWebs; 27.09.2012
comment
он уже заполнен возвращаемым $buffer. все, что вам нужно сделать, это включить output buffering. не делайте это более сложным, чем это должно быть. - person Gung Foo; 27.09.2012
comment
Итак, я сделал, как предлагает статья, см. код выше, и я все еще, похоже, терплю неудачу в жизни .... почему это не работает? - person TheWebs; 27.09.2012
comment
потому что буферизация вывода все еще не работает. попробуйте включить его через php.ini - пока подписывайтесь, удачи! - person Gung Foo; 27.09.2012
comment
это превращается в не тот ответ, который я хотел, поскольку у большинства людей не будет включена буферизация вывода ... особенно на общем хостинге или даже на частном .... - person TheWebs; 27.09.2012
comment
Вы бы предпочли найти, где именно в wordpress отображается вывод? снова... все, что вам нужно сделать, это включить буферизацию вывода до того, как будет передан какой-либо вывод, и сбросить его после отправки всех заголовков. вы также можете попробовать добавить свой код до того, как что-либо будет отображено в браузере. статья, которую я вставил, кажется полезной для других, поэтому вы, вероятно, делаете что-то не так. пора начать думать самостоятельно (хотя бы немного). спокойной ночи! - person Gung Foo; 27.09.2012
comment
Хорошо, я перепроверил, и у меня установлено значение 4086, извините за вопрос. Мне просто было любопытно. вот и думаю почему не работает.... - person TheWebs; 27.09.2012

Другой возможностью было бы добавление приоритета:

add_action('wp_head', 'add_ob_start', 1);

Третий параметр — это $priority.

Кроме того, если вы подключаете более одной функции, это дает вам полный контроль над цепочкой выполнения.

person stffndtz    schedule 30.10.2013