2

以下のコードに基づいて、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

ページがすでに読み込まれているため、これを取得します。しかし、この関数をどこで呼び出すかはわかりません。

私のウェブサイトと「個人データ」をstarsと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');

これでもエラーが発生します。何かを誤解していると思います。

4

3 に答える 3

3

次の行を置き換えるだけです

add_action('wp_head', 'add_ob_start');

add_action('init', 'add_ob_start');

出力バッファリングは、ブラウザに送信/エコーされる前に開始する必要があり、wp_headフックはフックより少し遅れて発生し、initそれまではヘッダーがすでに送信さfunctions.phpれており、ブラウザにエコー/送信される前にヘッダーを上部に保持/配置します。

于 2012-09-26T20:47:25.057 に答える
0

問題は、ワードプレスのどこかでheader()関数が呼び出され、オフのときに一部の出力がすでにクライアントに送信されているoutput bufferingことです。

出力の前にヘッダーを送信する必要があります。そうしないと、説明したエラーが発生します。

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

上記の行は、次のようなヘッダーを設定します。header('Location: admin.php......');

php.iniを介して、wordpressのindex.phpで、または単にクライアントにエコーされる前に出力バッファリングをオンにすると、エラーが処理されます。

詳細/ドキュメントはここにあります:http://php.net/manual/en/book.outcontrol.php

私が考えることができる最も簡単な方法は、wordpressindex.phpを次のようにすることです。

ob_start();
// content of your index.php here
ob_flush();
于 2012-09-26T19:26:42.470 に答える
0

別の可能性は、優先順位を追加することです。

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

3番目のパラメーターは$priorityです。

また、複数の関数をフックしている場合は、実行チェーンを完全に制御できます。

于 2013-10-30T14:28:33.077 に答える