WP-Actiate.php导致白屏死亡

时间:2017-03-18 作者:Paul \'Sparrow Hawk\' Biron

我正在为一个客户开发一个网站,它将成为多网站的一部分。我添加了许多新用户,但当这些用户试图确认他们的帐户时,他们会看到可怕的“死亡白屏”,他们的帐户不会被激活。

有人能帮我弄清楚为什么会这样吗?

1 个回复
最合适的回答,由SO网友:Paul \'Sparrow Hawk\' Biron 整理而成

[note: 我在提出此问题之前解决了问题,并认为其他人会觉得我的研究/解决方案很有帮助,请参阅Can I answer my own question?]

讨论中的站点使用了一个自定义主题和特定于站点的插件(注册自定义帖子类型、自定义分类法等),这两者我都写过。

事实证明wp-activate.php 引导结果为plugins not being loaded...这让我非常震惊(我在任何地方都找不到记录)。

我的主题header.php 调用特定于站点的插件中定义的方法之一。因为插件在wp-activate.php 运行时,该方法未定义,PHP将消亡。更糟的是wp-activate.php bootstrap还禁用PHP错误消息(即使在WP_DEBUG 设置为true),因此,白色死亡屏幕:-(

解决方案为了解决这个问题,我activate_header (第一个钩子在wp-active.php 引导)并自己加载特定于站点的插件,如下所示:

add_action (\'activate_header\', \'load_site_specific_plugin\') ;

function
load_site_specific_plugin ()
{
    if (wp_installing ()) {
        require_once (WP_PLUGIN_DIR . \'path to site-specific plugin\') ;
        }

    return ;
}
有关我测试的原因,请参见下面的血淋淋的死亡部分wp_installing() 通话前require_once().

另一种解决方案是添加header-wp-activate.php (这不依赖于特定于站点的插件中定义的任何方法)到我的主题。就我而言,这似乎不是正确的选择,但对其他人来说可能是。

血淋淋的细节我不知道为什么wp-activate.php 不应加载插件。但下面是对wp-activate.php 引导,以及为什么它会导致插件无法加载和PHP错误消息无法显示。

第一wp-activate.php 开始于:

define( \'WP_INSTALLING\', true );
定义WP_INSTALLING as true在整个wp-activate.php 独自创立对于我所遇到的问题,最重要的是wp_get_active_and_valid_plugins() (调用wp-settings.php 作为引导的一部分)包含以下内容:

if ( empty( $active_plugins ) || wp_installing() )
    return array();
因此,bootstrap认为该站点甚至不使用任何插件get_option(\'active_plugins\') 返回非空数组。

了解为什么在加载我的主题时WP死机时没有输出PHP错误header.php (再说一次,即使我define (\'WP_DEBUG\', true) ;), 我们得看看路wp_debug_mode() 已写入。wp_debug_mode() 在调用之前调用wp_get_active_and_valid_plugins()wp-activate.php 引导并包含以下内容:

if ( defined( \'XMLRPC_REQUEST\' ) || defined( \'REST_REQUEST\' ) || ( defined( \'WP_INSTALLING\' ) && WP_INSTALLING ) || wp_doing_ajax() ) {
    @ini_set( \'display_errors\', 0 );
}
因此wp-activate.php bootstrap不会加载任何插件,它还会导致因该事实而导致的PHP错误无法显示;因此,死亡的白色屏幕!啊!!!

谁能向我解释一下为什么wp-activate.php 引导应该这样做吗?

TL;DR:请参阅the comment 我留下了一篇关于Make WordPress Core上的下一个引导/加载特性项目的帖子。