WordPress:显示所有类别的帖子,每个类别最多 5 个帖子,并按日期排序?
WordPress: Display the posts of all categories, at most 5 posts per category, and ordered by date?
我不确定以前是否有人回答过这个问题,但到目前为止,我在谷歌上的大力搜索并没有带我到任何地方。
我有一个 wordpress 网站,我想像往常一样按日期显示所有 post。但是,我不想对显示的 post 总数设置限制,而是想对每个类别设置限制。
例如,如果我有两个类别 FOO 和 BAR,我希望 WordPress 显示所有但最多 5 个来自 FOO 和 BAR 的 post。 posts 应该 still 按日期排序,我的意思是来自 FOO 的任何 post 在来自 BAR 的 posted 之前首先出现反之亦然。
具体问题:去年 FOO 类别中有一个 post,然后 BAR 中有 20 个条目,现在我在 FOO 类别中添加另一个 post。通常,post 限制为 10 的 Wordpress 会显示这个最新的 FOO 条目和另外 9 个 BAR 条目。但是,我希望它显示我的 FOO 条目和最近的 5 个 BAR 条目。只有我再添加4个FOO条目后,去年的FOO条目就不会再显示了。
实现此目标的最佳、最干净和可维护的方法是什么?
如有任何帮助,我将不胜感激。
未经测试,但这应该可以帮助您入门:
$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
}
您只需使用 get_categories
、get_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 }
鉴于似乎没有其他解决方案可以进行大量查询,我设计了以下内容,添加到 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
.
修改的
我仍然更喜欢速度稍快的解决方案,即只执行单个查询的解决方案。
我不确定以前是否有人回答过这个问题,但到目前为止,我在谷歌上的大力搜索并没有带我到任何地方。
我有一个 wordpress 网站,我想像往常一样按日期显示所有 post。但是,我不想对显示的 post 总数设置限制,而是想对每个类别设置限制。
例如,如果我有两个类别 FOO 和 BAR,我希望 WordPress 显示所有但最多 5 个来自 FOO 和 BAR 的 post。 posts 应该 still 按日期排序,我的意思是来自 FOO 的任何 post 在来自 BAR 的 posted 之前首先出现反之亦然。
具体问题:去年 FOO 类别中有一个 post,然后 BAR 中有 20 个条目,现在我在 FOO 类别中添加另一个 post。通常,post 限制为 10 的 Wordpress 会显示这个最新的 FOO 条目和另外 9 个 BAR 条目。但是,我希望它显示我的 FOO 条目和最近的 5 个 BAR 条目。只有我再添加4个FOO条目后,去年的FOO条目就不会再显示了。
实现此目标的最佳、最干净和可维护的方法是什么?
如有任何帮助,我将不胜感激。
未经测试,但这应该可以帮助您入门:
$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
}
您只需使用 get_categories
、get_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 }
鉴于似乎没有其他解决方案可以进行大量查询,我设计了以下内容,添加到 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
.
我仍然更喜欢速度稍快的解决方案,即只执行单个查询的解决方案。