插件--处理404个页面的正确方式?

时间:2020-04-08 作者:uPrompt

使用插件将404重定向到其他页面。这就是问题所在。我偶尔会在日志文件中看到:

[08-Apr-2020 14:48:45 UTC] PHP Notice:  Trying to get property of non-object in {path}/wp-includes/class-wp-query.php on line 3998
[08-Apr-2020 14:48:45 UTC] PHP Notice:  Trying to get property of non-object in {path}/wp-includes/class-wp-query.php on line 4000
[08-Apr-2020 14:48:45 UTC] PHP Notice:  Trying to get property of non-object in {path}/wp-includes/class-wp-query.php on line 4002
这显然与此bug有关:

https://core.trac.wordpress.org/ticket/29660

我一直在这样做:

    add_action(\'template_redirect\', array($this, \'My_404_Handler\'));
我一直在调用该函数中的is\\u 404()。从bug报告中,它是否返回true或false取决于您何时调用它。在我的例子中,wp包含/class wp查询。php有一个函数get\\u queryed\\u object(),它可以向函数is\\u page()返回空值。问题是,当get\\u queryed\\u object返回null时,is\\u page()只处理对象结果并产生上述错误。

我还查看了服务器日志,无法确定导致此错误的任何特定url请求。

我希望有人对此有一些经验,并能告诉我更改以下代码是否能解决问题?

    add_action(\'wp\', array($this, \'My_404_Handler\'));
我正在测试,但由于我不知道如何再现错误,我只是在黑暗中试一试。

谢谢

编辑

404功能

    public function My_Plugin_handle404() {
    if (is_404()) {
        //user set option to show the real 404
        if (get_option(\'Show404\') == \'TRUE\') {
            include(get_404_template());
        } else {
            //log the request info to the db and show a blank page with a 200 result
            $this->My_Plugin_Process_Request();
            status_header(200);
            exit;
        }
    } 
}

1 个回复
SO网友:fuxia

处理自定义404内容的适当挂钩是404_template. 当WordPress试图包含默认模板时,但在发送任何HTTP头之前,就会发生这种情况。

因此,您可以更改模板、发送或覆盖HTTP头,所有这些都无需任何检查,因为WordPress已经为您完成了这些。

在大多数情况下,您应该not 重定向这些请求。重定向是3xx状态,而不是4xx。

你可能会在我的old 404 plugin.

相关推荐