PRE_GET_POST中的IS_CATEGORY()出现奇怪错误

时间:2013-12-01 作者:Alvaro

我有一个函数,可以根据查看的类别设置posts\\u per\\u page选项。

我发现了一个我无法真正理解的错误:首先,这是我如何得到错误的:

function custom_posts_per_page($query) {

    if ( !is_admin() && is_category(4)) {

    // Leaving this empty or with content

    }

}

add_filter( \'pre_get_posts\', \'custom_posts_per_page\' );
因此,如果WP\\u Debug变为true,并且当我访问一个不存在的类别时,我会在那里得到一个错误。所以如果我进去http://localhost/zz/category/uncategorized 没有问题,但如果我输入例如http://localhost/zz/category/aaaaaaaa (类别AAAAAAA不存在),它正确进入404页,但抛出以下错误:

Notice:  Trying to get property of non-object in C:\\xampp\\htdocs\\zz\\wp-includes\\query.php on line 3420
Notice:  Trying to get property of non-object in C:\\xampp\\htdocs\\zz\\wp-includes\\query.php on line 3422
Notice:  Trying to get property of non-object in C:\\xampp\\htdocs\\zz\\wp-includes\\query.php on line 3424
怎么了?

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

经过一点调查。。。

如果将类别传递给is_category 它使用get_queried_object 要获取数据--see the source. get_queried_object returns NULL 对于不存在的类别。您可以通过以下方式进行演示:

function custom_posts_per_page($query) {
  var_dump(get_queried_object());
}
add_filter( \'pre_get_posts\', \'custom_posts_per_page\' );
加载有效的类别存档,然后加载无效的类别存档。

这个is_category 方法在尝试使用该对象之前不会检查其是否具有有效对象,因此会出现错误。我肯定会认为这是一个bug。

我看到它的唯一方法是首先检查类别的存在:

function custom_posts_per_page($query) {

    if ( !is_admin() && term_exists(4,\'category\') && $query->is_category(4)) {

    // Leaving this empty or with content

    }

}

add_filter( \'pre_get_posts\', \'custom_posts_per_page\' );
或者自己处理逻辑:

function custom_posts_per_page($query) {

    if ( !is_admin() && $query->is_category()) {
      $qobj = get_queried_object();
      if (!empty($qobj)
        && (isset($qobj->taxonomy) && \'category\' == $qobj->taxonomy && 4 == $qobj->term_id)
      ) {
        var_dump($qobj);
      }
    // Leaving this empty or with content

    }

}

add_filter( \'pre_get_posts\', \'custom_posts_per_page\' );
几乎未经测试。可能是马车。买主注意事项。不退款。

结束