将“分类搜索顺序”与“不显示子帖子”相结合

时间:2015-04-11 作者:lkl

这些代码的每一位在类别中都是独立工作的。php,但当我同时使用两者时,第一个被忽略。有人能告诉我如何将它们组合成一段代码,或者至少让它们很好地配合在一起吗?

<?php if (is_category())
{ $posts = query_posts( $query_string . \'&orderby=title&order=asc&posts_per_page=18\' );
} ?>

<?php $current_cat = intval( get_query_var(\'cat\') );
$paged = (get_query_var(\'paged\')) ? get_query_var(\'paged\') : 1;
$args=array(
\'category__and\' => array($current_cat),
\'paged\' => $paged,
\'post_type\' => \'post\',
\'caller_get_posts\'=> 1
);
query_posts($args);
?>

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

如前所述,您不应该使用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

    }
}

SO网友:Stephen Harris

Don\'t use query_posts() ;).

简言之query_posts() 超越全球$wp_query. 因此,后续调用将替换以前的调用。相反,您应该使用pre_get_posts:

function wpse183914_filter_child_cats_and_order( $query ) {

    //Alter front-end main query for categories only.
    if ( $query->is_main_query() && $query->is_category() && !is_admin() ) {
        $cat_id = $query->get_queried_object_id();
        $child_cats = (array) get_term_children( $cat_id, \'category\' );

        //exclude the posts in child categories
        $query->set( \'category__not_in\', $child_cats );

        //Set sort order
        $query->set( \'orderby\', \'title\' );
        $query->set( \'order\', \'asc\' );

        //Exclude sticky (see remark at bottom)
        $query->set( \'ignore_sticky_posts\', true );
    }
}
add_filter( \'pre_get_posts\', \'wpse183914_filter_child_cats_and_order\' );
(作为旁白caller_get_posts is deprecated).

结束

相关推荐

GET_CATEGORIES上的用户定义顺序?

下面是一些将特定类别调用到我们的首页帖子循环的基本代码。它工作正常,只是我的客户希望类别按特定顺序显示。我知道互联网上还有其他关于这一点的帖子,但我没有看到任何像我的客户所问的那样解决这一问题的帖子。我可以接受下面代码中创建的$categories变量,并将这些对象调用到一个新数组中吗?在这种情况下,所有对象前面都有一个数字,如:[0] => values [1] => values [2] => values .... 输出转储时。我可以把输出结果按我