包含wp-load.php会导致类方法中出现致命错误

时间:2018-05-23 09:27:48

标签: php wordpress

我正在做一个直接的.php调用(ajax)。由于我的类,加载系统,我需要稍后加载wp-load,而不是在开始时加载。

所以,如果我的文件只有这个:

var query = (from t1 in lst
                     join t2 in (from b in lst
                                 group b by b.REQUEST_ID into grp
                                 select new
                                 {
                                     EndTime = (from g1 in grp select g1.EXECUTION_DTTM).Max(),
                                     REQUEST_ID = grp.Key,
                                     Transactions = grp.Count(),
                                     Success = ((from g2 in grp select g2.ITEM_STATUS_CD).Count(x => x == 0)) * 100 / grp.Count(),
                                     Warning = ((from g3 in grp select g3.ITEM_STATUS_CD).Count(x => x == 1)) * 100 / grp.Count(),
                                     Error = ((from g4 in grp select g4.ITEM_STATUS_CD).Count(x => x > 1)) * 100 / grp.Count(),
                                 }).OrderByDescending(x => x.REQUEST_ID).Take(100)
                     on new { RID = t1.REQUEST_ID, EXDT = t1.EXECUTION_DTTM } equals new { RID = t2.REQUEST_ID, EXDT = t2.EndTime }
                     select new
                     {
                         t1.REQUEST_ID,
                         t2.Transactions,
                         t2.EndTime,
                         t2.Success,
                         t2.Warning,
                         t2.Error
                     }).Distinct().ToList();

它运行正常。但如果它包含在一个类中:

include $_SERVER['DOCUMENT_ROOT'] . '/wp-load.php';

它因致命错误而死:

PHP致命错误:在第11行的/var/www/wp-content/sunrise.php中调用未定义的方法stdClass :: escape()

我看不出任何理由!

2 个答案:

答案 0 :(得分:1)

您似乎正在尝试在正常参数之外加载WordPress多站点(在sunrise.php判断是这里的问题)。请尝试加载此文件:

include $_SERVER['DOCUMENT_ROOT'] . '/wp-blog-header.php';

这会跳过定义index.php常量的WP_USE_THEMES,并假设你没有加载网站的前端(至少不是传统的,你不是)。

现在应该为你加载一切正确的顺序。

答案 1 :(得分:1)

我也看不出你的代码有什么问题。所以我测试了一次只是为了确认它确实有用。

<?php

class Paff
{
    public function x()
    {
        include $_SERVER['DOCUMENT_ROOT'] . '/wp-load.php';
        echo 'wp-load.php included. ABSPATH=' . ABSPATH;
    }
}

(new Paff())->x();

?>

它运行没有错误!并在浏览器中显示以下内容。

wp-load.php included. ABSPATH=D:\bronce/ 

我显示了ABSPATH只是为了确认包含了wp-load.php,因为它定义了ABSPATH。

所以这应该在我的安装上工作,这是非常标准的,因为几周前我刚刚安装了PHP,我知道我没有非常改变默认值。那为什么它不能在您的系统上运行?它必须配置不同。您的系统是否正在运行任何预执行处理程序?

我刚刚搜索了#sunrise; sunrise.php&#39;我最初认为是你的代码的名称。它实际上可能是感染(或不感染),请参阅https://premium.wpmudev.org/blog/removing-backdoor-exploits/。我认为它的名称被配置为作为预执行处理程序运行。一些插件合法地安装预执行处理程序,例如, WordFence。不幸的是,这次我没有安装WordFence,我也不记得它的执行前处理程序的名称。

我刚刚阅读了WordFence的源代码。它确实安装了一个预执行处理程序,但它的名字是ABSPATH。 &#39; wordfence-waf.php&#39 ;.但是,WordFence还引用了&#39; ... / wp-content / sunrise.php&#39;显然是在多站点加载之前执行的。你在使用WordFence吗?您的网站是多站点吗?

重点是:问题不在您的代码中,而在于预执行处理程序。预执行处理程序可以是大量的PHP代码,可以显着改变PHP执行环境,这就是WordFence等插件使用它来监视代码执行的原因。