PRE_GET_POST中的IS_CATEGORY导致php通知

时间:2018-10-31 作者:beholder

我正在试着设置posts_per_page 取决于显示的类别。

以下代码有效。

function category_posts_per_page( $query )
{

    if ( $query->is_main_query() && $query->is_category() && $query->is_category(\'books\') ) {
        $query->set(\'posts_per_page\', 2);
    }

}
add_action( \'pre_get_posts\', \'category_posts_per_page\' );

The problem:

我在调试日志中每隔30秒就会收到一个php通知。没有关于访问任何帖子、页面、类别或任何手动操作的通知。

来自调试。日志:

[31-Oct-2018 10:18:46 UTC] PHP Notice:  Trying to get property \'term_id\' of non-object in /var/www/html/wp-includes/class-wp-query.php on line 3502
[31-Oct-2018 10:18:46 UTC] PHP Notice:  Trying to get property \'name\' of non-object in /var/www/html/wp-includes/class-wp-query.php on line 3504
[31-Oct-2018 10:18:46 UTC] PHP Notice:  Trying to get property \'slug\' of non-object in /var/www/html/wp-includes/class-wp-query.php on line 3506
我禁用了所有插件,将主题切换为默认主题(并将上述代码添加到functions.php)。

我该如何解决这个问题?代码运行正常,只是一个php通知,但有点烦人。。。尤其是现在在开发中,所有注意事项都可以在调试中看到。

2 个回复
最合适的回答,由SO网友:Milo 整理而成

is_category(\'category-name\') 在运行查询之前不会工作。如果我们检查生成这些通知的源代码,我们可以看到它正在使用get_queried_object, 它使用主查询的结果填充,并在pre_get_posts 阶段仍将为空。

作为替代,请检查$query->query_vars, 这将是从请求的URL解析的查询变量数组。

SO网友:Friss

也许你应该尝试这种行为只发生在前端,添加!\\u admin是这样的。这可能是由于管理ajax心跳?

function category_posts_per_page( $query )
{

    if (!is_admin() && $query->is_main_query() && $query->is_category() && $query->is_category(\'books\') ) {
        $query->set(\'posts_per_page\', 2);

    }

}
add_action( \'pre_get_posts\', \'category_posts_per_page\' );

结束