按类别和时间排序的Wordpress查询

时间:2017-10-20 14:41:47

标签: php wordpress genesis

我发现了这个问题:

Wordpress outside loop sort by category and time

但问题或答案中没有提供很多背景知道它是否适用于我。我正在使用流行的创世纪框架和儿童主题。我不想修改任何核心WP文件,因为它们会在更新时被覆盖。我想这可以通过我的functions.php或front-page.php文件来完成。

我一次列出25个帖子。在这25个帖子中,我希望任何来自第一类的帖子都列在顶部,而第二类的帖子则列在后面。在第一类和第二类循环中,帖子将按正常进入时间列出。

最好的方法是什么?

2 个答案:

答案 0 :(得分:0)

SDS 你需要两个循环一个用于类别,一个用于帖子。 所以你可以尝试这种类型的代码

/*category args for listed according to name in assending order*/
$category_arg = array(
        'orderby' => 'name',
        'order'   => 'ASC'
    );

$all_cat = get_categories($category_arg);

/*Loop for all category*/
foreach ($all_cat as $key => $cat) {

/*Query for post of perticular category with orderby posted date*/  
$args =  array(
    'cat'  => $cat->cat_ID,
    'posts_per_page' => -1,
    'orderby' => 'date',
    'order'   => 'DESC',
) ;

query_posts( $args );

echo '
<div class="one-category-block">
    <h1>'.$cat->cat_name.'</h1>';
echo '<ul>';
while ( have_posts() ) : the_post();
    echo '<li>';
                the_title();
    echo '</li>

';
endwhile;
echo '</ul>
</div>';


wp_reset_query();


}

尝试这种类型的代码,然后让我知道结果。 感谢

答案 1 :(得分:0)

好的。你不能直接在查询上做到这一点,我很害怕。

但是,它仍然很容易做到。首先,将查询中的帖子放入数组中:

$posts = array();
while ( have_posts() ) {
    the_post(); 
    array_push($posts, $post);
}

然后对该数组进行排序:

usort($posts, function($a, $b) {
    if(has_term("mycategory", "mytaxonomy", $a->ID) && !has_term("mycategory", "mytaxonomy", $b->ID))  return -1;
    if(!has_term("mycategory", "mytaxonomy", $a->ID) && has_term("mycategory", "mytaxonomy", $b->ID))  return 1;
    return $b->post_date - $a->post_date;
});

我已经做到这一点,以便mycatgegory分类中mytaxonomy的帖子位于首位,但通常按发布日期排序。

然后只需使用常规的foreach循环来迭代(现已排序的)帖子

foreach($posts as $post) {
    setup_postdata($post);
    // continue outputting the posts here
}
wp_reset_postdata();

setup_postdata()确保您可以在不更改代码的情况下使用get_the_ID(),get_permalink()等等。