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 中有效,而谷歌浏览器显示:错误 330 (net::ERR_CONTENT_DECODING_FAILED):

挖掘用户网络服务器,我发现 WP 配置或插件使用 ob_start("ob gzhandler")。

ob_get_status(true) 显示在我的工作网络服务器中:

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
        )

)

在错误的网络服务器中:

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
        )

)

我的用户网络服务器中的序列是:

  • 我的代码调用 ob_start()
  • 包括WP核心,WP初始化所有并调用ob_start("ob gzhandler")
  • 当我的代码调用 ob_end_clean() 时,它失败了。

我需要一种安全的方法来隐藏 WP 警告,但我无法破坏启用 GZIP 的配置(我怀疑是某些插件)。如果不可能,我更喜欢在警告系统中留下破坏 ajax 并忘记缓冲方法。

我认为一个干净的方法可能是:

$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。

打破阿贾克斯:

 <?php

不会破坏 AJAX:

<?php
于 2012-07-23T21:05:52.767 回答