WordPress:显示所有类别的帖子,每个类别最多5个帖子,并按日期排序?

时间:2015-01-04 20:37:23

标签: php mysql wordpress

我不确定之前是否已经回答过这个问题,但是到目前为止,有力的谷歌搜索还没有引起我的注意。

我有一个wordpress网站,我希望像往常一样按日期排序显示所有帖子。但是,我想对每个类别设置一个限制,而不是对显示的帖子总数设置限制。

例如,如果我有两个类别FOO和BAR,我希望WordPress显示来自FOO和BAR的全部,但最多5个帖子。这些帖子仍然按日期排序,我的意思是来自FOO的任何帖子在BAR之前发布的帖子首先出现,反之亦然。

具体问题:去年FOO类别中有一个帖子,之后是BAR中的20个条目,现在我在FOO类别中添加了另一个帖子。通常,帖子限制为10的Wordpress会显示最近的FOO条目和9个BAR条目。但是,我希望它显示我的FOO条目和最近的5个BAR条目。只有在我再添加4个FOO条目后,才会显示去年的FOO条目。

实现这一目标的最佳,最清洁和可维护的方法是什么?

我将非常感谢任何帮助。

3 个答案:

答案 0 :(得分:1)

鉴于似乎没有其他解决方案可以进行疯狂的查询,我设计了以下内容,添加到functions.php

function alter_query( $query ) {
    if ( $query->is_home() && $query->is_main_query() ) {
        $post_limit = floor(get_settings('posts_per_page')/2);      
        $the_posts = array();
        foreach (get_terms('category',array('hide_empty'=>1,'fields'=>'ids')) as $id) 
            $the_posts = array_merge( $the_posts, 
                get_posts( array(
                    'fields'      => 'ids',
                    'numberposts' => $post_limit,
                    'category'    => $id, 
                    'orderby'     => 'post_date')));
        $query->set('post__in',    $the_posts);
        $query->set('numberposts', -1);
        $query->set('orderby',     'post_date');
    }
}
add_action( 'pre_get_posts', 'alter_query' );

在此解决方案中,我只首先获取所有相关帖子的 ids ,而不是所有内容,然后执行查询以检索实际数据。到目前为止,我更喜欢这个解决方案,因为我可以在不触及主循环的情况下使用它,后者通过钩子pre_get_posts修改。

我仍然更喜欢更快一点的解决方案,即只执行单个查询的解决方案。

答案 1 :(得分:0)

未经测试,但这应该让你开始:

$terms = get_terms('category');
$results = array(); //Initialize results array
foreach($terms as $term){
    $args = array(
        'posts_per_page'=>5,
        'tax_query' => array(
            array(
                'taxonomy' => 'category',
                'terms'    => $term->term_id,
            ),
        )
    );
    $q = new WP_Query($args);
    if($q->have_posts()) : while($q->have_posts()) : the_post();
        $results[] = $post->ID; //Append IDs to results
    endwhile;endif;
}
if($all_posts = array_unique($results)){ //Filter out the duplicates
    $q = new WP_Query(array('post__in'=>$all_posts)); //Query all results
    while($q->have_posts()) : the_post();
        //Loop markup goes here
    endwhile;
}
else{
    //No posts found
}

答案 2 :(得分:0)

您只需使用get_categoriesget_posts按日期排序,并使用foreach来显示结果。

这是:

<?php
// Setting blank array
$posts_category = array();

// Getting categories
$args = array('type' => 'post', 'orderby' => 'name', 'hide_empty' => 1);
$categories = get_categories( $args ); // Getting all categories

foreach($categories as $category) {
          $counter = 1;

          // Getting posts
          $args = array('posts_per_page'=> 5, 'offset'=> 1, 'category' => $category->term_id, 'post_status' => 'publish', 'orderby' => 'date', 'order' => 'ASC');
          $posts = get_posts( $args ); // Getting all posts

          if(count($posts) >= 1) {
                    foreach($posts as $post) { // Register every post found
                              if(!array_key_exists($post->ID, $posts_category)) {
                                $posts_category[$post->ID] = array('title' =>$post->post_title, 'permalink' => get_permalink($post->ID), 'date' => $post->post_date);
                                $counter = $counter+1;
                              }
                    }
          }
}

// Sorting all posts by date
function sortByDate($a, $b) {
          return strtotime($a["date"]) - strtotime($b["date"]);
}
usort($posts_category, "sortByDate");
$posts = array_reverse($posts_category);

//Showing results
foreach($posts_category as $post) { ?>
<li>
          <a href="<?php echo $post['permalink']; ?>"><?php echo $post['title']; ?></a>
</li>
<?php }