如前所述,您不应该使用query_posts
因为它打破了其他代码和插件所依赖的主查询和许多功能
Note: 此功能不适用于插件或主题。如后文所述,有更好、性能更好的选项来更改主查询。query\\u posts()是一种过于简单且有问题的方法,通过将页面的主查询替换为新的查询实例来修改它。它效率低下(重新运行SQL查询),并且在某些情况下会彻底失败(尤其是在处理POST分页时)。
此外,永远不要用自定义查询替换主查询。这就产生了更多的问题,而这些问题都是你一开始就试图解决的。阅读this post 关于这个问题
尽管如此,你还是要利用pre_get_posts
更改主查询以更改按标题排序的帖子的顺序。那么您将使用parse_tax_query
从类别页面中删除子类别的步骤
您可以在函数中执行类似的操作。php
add_action( \'pre_get_posts\', function ( $q )
{
if ( ! is_admin()
&& $q->is_main_query()
&& $q->is_category()
) {
/*
* Set the order so that posts are ordered by post title
*/
$q->set( \'orderby\', \'title\' );
$q->set( \'order\', \'ASC\' );
/*
* Ignore sticky posts, this is the correct syntax to use
*/
$q->set( \'ignore_sticky_posts\', true );
/*
* Filter the tax query to remove child categories from category pages
*/
add_filter( \'parse_tax_query\', function ( $q )
{
if ( $q->is_main_query()
) {
$q->tax_query->queries[0][\'include_children\'] = 0;
}
});
}
});
此外,正如已经指出的那样,
caller_get_posts
已折旧并替换为
ignore_sticky_posts
.
最后,您的category.php
应该是这样的
if ( have_posts() ) {
while ( have_posts() ) {
the_post();
// Your HTML Mark up and template tags etc
}
}