web-dev-qa-db-ja.com

プラグインが有効化されている場合にのみwp-adminで「ヘッダー情報を変更できません - ヘッダーは既に送信されています」というエラーが表示される

この問題は この質問 にあり、問題の原因を突き止めようとしましたが、今ではもっと混乱しています。

現在のWordPress 4.5.5から自分のサイトをアップグレードしようとしています。しかし、まず最初に、テーマとプラグインによって引き起こされたエラーを解決したいです。

Wp-config.phpでは、WP_DEBUGとWP_DEBUG_LOGをtrueに設定しました。

私はすべてのプラグインを無効にし、Twenty 15のテーマを有効にしました。

このような状況下では、フロントエンドではなく、wp-adminページでのみ次のエラーが発生します。

PHP Warning:  An unexpected error occurred. Something may be wrong with WordPress.org or this server&#8217;s configuration. If you continue to have problems, please try the <a href="https://wordpress.org/support/">support forums</a>. (WordPress could not establish a secure connection to WordPress.org. Please contact your server administrator.) in /Applications/MAMP/htdocs/site-url.com/wp-includes/update.php on line 306

また、1つのプラグインをアクティブにすると(最初に試した3つのプラグインで1つずつ)、次のような他のエラーも発生します。

PHP Warning:  Cannot modify header information - headers already sent by (output started at /Applications/MAMP/htdocs/site-url.com/wp-includes/update.php:306) in /Applications/MAMP/htdocs/site-url.com/wp-includes/pluggable.php on line 1167

私は以下のプラグインのそれぞれでそのエラーを得ました、それぞれが別々に活性化されました、そして、二十五のテーマが活発である:

  • AFC FLVプレーヤー
  • AFCプラグシステム
  • Akismet(これは非常に安全なプラグインのように思えました)

これらのプラグインはそれぞれ最新のものになっています。

これは 詳細なログファイルです 私がしたことと各ステップでのエラーに注目してください。

これは奇妙な振る舞いのように思えますが、どのヘッダを起動しても「ヘッダはすでに送信されました」というエラーが発生します。

このエラーを解決するための次のステップは何ですか?私はそれが問題がfunctions.phpにあると言う時に理解するように、デバッグメッセージが具体的に欠けているのを発見しています、それは実際にはほとんどいつも他の何かによって引き起こされます。

4
Mike Eng

エラー診断

最初のエラー:

PHP Warning:  An unexpected error occurred. Something may be wrong with WordPress.org or this server&#8217;s configuration. If you continue to have problems, please try the <a href="https://wordpress.org/support/">support forums</a>. (WordPress could not establish a secure connection to WordPress.org. Please contact your server administrator.) in /Applications/MAMP/htdocs/site-url.com/wp-includes/update.php on line 306

これは基本的にWordPressがコア、プラグイン、テーマあるいは翻訳関連のアップデートをチェックするためにapi.wordpress.orgに接続しようとしていることです。自動アップデートを無効にしても、手動アップデートにもアップデートチェックが必要なので、WordPressはこれらのチェックを行います。

2番目のエラー:

PHP Warning:  Cannot modify header information - headers already sent by (output started at /Applications/MAMP/htdocs/site-url.com/wp-includes/update.php:306) in /Applications/MAMP/htdocs/site-url.com/wp-includes/pluggable.php on line 1167

これはおそらくWordPressがHTTPヘッダを生成する前に出力に送られている最初のエラー(あるいは他の何らかのエラー)の結果です。実際、HTTPヘッダを送信する前に何か(printechoなど)を出力した場合、このheaders already sentエラーが発生します。

その他のエラー:

私があなたのdebug.logダンプで見た唯一の他のエラーは廃止予定のWordPress関数呼び出しを使用しているいくつかのプラグインです。それらのプラグインが更新されたバージョンを持っている場合、これらのエラーは更新後も持続しませんので、それらは本当に深刻ではありません。

より良いエラー管理:

デバッグするときは、これらのエラーをdebug.logファイルにのみ送信し、wp-config.phpで次のようにエラーをブラウザに表示しないようにします。

define('WP_DEBUG', true);
define('WP_DEBUG_LOG', true);
define('WP_DEBUG_DISPLAY', false);

上記を設定すると、エラーを出力バッファ(ブラウザなど)に出力する代わりに、WordPressはdebug.logディレクトリにあるwp-contentファイルにエラー only を出力します(Webから書き込み可能な場合)。サーバ)。これの利点は:

  1. ブラウザよりもdebug.logファイルのエラー(エラー、警告、注意など)をチェックする方が簡単です。

  2. ブラウザへのエラー出力はサイトのHTMLを壊します。

  3. Error only debug.logファイルに記録することで、関連するheaders already sentエラーもすべて回避できます。

WordPressのアップデートチェックを中止します。

上記のデバッグ方法を採用した後でも、WordPressはあなたのdebug.logファイルに最初のエラーを生成し続けます。それはdebug.logファイルを非常に速くいっぱいにするでしょう、そしてあなたがlocalhostで開発している時(特にあなたがオフラインの時)は更新を継続的にチェックする必要は本当にないのでそれは厄介です。

幸い、pre_http_requestフィルタフックを使ってこのアップデートチェックを止めることができます。あなたのテーマのfunctions.phpファイルで、あるいはもっと良いことに、カスタムプラグインで以下のコードを使用して、オフラインまたはlocalhostで開発しているときにWordPressの更新チェックを停止するためにそれを使用してください。

add_filter( 'pre_http_request', 'wp_update_check_short_circuit', 20, 3 );
function wp_update_check_short_circuit( $preempt = false, $args, $url ) {
    if ( stripos( $url, 'https://') === 0 ) {
        $url = substr( $url, 8 );
    }
    else {
        $url = substr( $url, 7 );
    }

    // stop other URL(s) requests as well (if you need to) in the same manner
    if ( stripos( $url, 'api.wordpress.org') === 0 ) {
        // WP is trying to get some info, short circuit it with a dummy response
        return array(
            'headers'   => null,
            'body'      => '',
            'response'  => array(
                'code'      => 503,
                'message'   => 'SERVICE_UNAVAILABLE'
                ),
            'cookies'   => array(),
            'filename'  => ''
            );
    }
    // returning false will let the normal procedure continue
    return false;
}

このコードは基本的にWordPress HTTP APIを使用してapi.wordpress.orgに送信されたHTTPリクエストをショートするため、これ以降、WordPressはアップデートチェック関連のエラーを生成しなくなります。他の内部HTTPリクエストもショートする必要がある場合は、上記のコードを変更してください。

注: ライブサーバーに変更をアップロードするときは、必ずこのコードをオフにしてください。ライブサーバーでアップデートチェックを誤って停止しないようにするには、カスタムプラグインで上記のコードを使用することをお勧めします。そのようにして、あなたがlocalhostで開発しているときだけ、プラグインを有効にすることができます。

1
Fayaz