3

のプラグインを書いていますWordPress。私の目標は、それをすべての人のために機能させることです。一部のページはajax応答を使用します。一部のユーザーは、テーマや他のプラグインからのエラーと警告を表示するWP_DEBUG定数をアクティブにしました。

コアが含まれているため、これによりAjax PHPが破損Wordpressし、一部のブログでWPが警告を表示する可能性があります。

私がこれを解決した古い方法は次のとおりです。

<?php
ob_start();
//The wordpress core require
ob_end_clean();

//Now the ajax response:
echo '0';
?>

ただし、あるユーザーから非常に奇妙なバグが報告されました。ajaxページが応答せず、Operaでのみ機能し、Google Chromeは次のように述べています。エラー330(net :: ERR_CONTENT_DECODING_FAILED):

ユーザーのWebサーバーを調べてみると、WP構成、プラグイン、またはその他の方法でob_start( "ob gzhandler")が使用されていることがわかりました。

ob_get_status(true)は、動作中のWebサーバーに表示されます。

Array
(
    [0] => Array
        (
            [chunk_size] => 4096
            [type] => 1
            [status] => 0
            [name] => default output handler
            [del] => 1
        )

    [1] => Array
        (
            [chunk_size] => 0
            [size] => 40960
            [block_size] => 10240
            [type] => 1
            [status] => 0
            [name] => default output handler
            [del] => 1
        )

)

そして、バグのあるWebサーバーでは:

Array
(
    [0] => Array
        (
            [chunk_size] => 4096
            [type] => 1
            [status] => 0
            [name] => default output handler
            [del] => 1
        )

    [1] => Array
        (
            [chunk_size] => 0
            [size] => 40960
            [block_size] => 10240
            [type] => 1
            [status] => 0
            [name] => default output handler
            [del] => 1
        )

    [2] => Array
        (
            [chunk_size] => 0
            [size] => 40960
            [block_size] => 10240
            [type] => 1
            [status] => 0
            [name] => ob_gzhandler
            [del] => 1
        )

)

私のユーザーWebサーバーのシーケンスは次のとおりです。

  • 私のコードはob_start()を呼び出します
  • WPコアを含め、WPはすべてを初期化し、ob_start( "ob gzhandler")を呼び出します
  • 私のコードがob_end_clean()を呼び出すと、失敗します。

WP警告を非表示にする安全な方法が必要ですが、GZIP対応の構成(疑わしいプラグイン)を壊すことはできません。不可能な場合は、警告システムにajaxを壊したままにして、bufferメソッドを忘れることをお勧めします。

クリーンな方法は次のようになると思います。

$buffers = count(ob_get_status(true));
ob_start();
//The wordpress core require
if (count(ob_get_status(true)) == $buffers + 1) {
ob_end_clean();
} else {
ob_flush();
}
//Now the ajax response:
echo '0';

しかし、PHPのバージョンと構成、WPのバージョン、プラグイン、構成による無限の組み合わせのいくつかは、誰かを壊してしまうのではないかと心配しています。この問題を解決する良い方法は何だと思いますか?

4

1 に答える 1

0

プラグイン (または functions.php) に必要なファイルで open php タグの前にスペースや行を残すと、Wordpress AJAX が壊れます。

ブレーク AJAX:

 <?php

AJAX を壊さない:

<?php
于 2012-07-23T21:05:52.767 に答える