【问题标题】:WordPress: Display the posts of all categories, at most 5 posts per category, and ordered by date?WordPress:显示所有类别的帖子,每个类别最多5个帖子,并按日期排序?
【发布时间】:2015-01-04 20:37:23
【问题描述】:

我不确定以前是否已经回答过这个问题,但是到目前为止,大力的谷歌搜索并没有把我带到任何地方。

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

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

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

实现这一目标的最佳、最干净和可维护的方法是什么?

如果有任何帮助,我将不胜感激。

【问题讨论】:

  • 我猜这个插件会被你完全使用wordpress.org/plugins/recent-posts-from-each-category
  • @MKhalidJunaid:我已经尝试过该插件,但它的功能更多(坦率地说,与我需要的不完全相同)。不幸的是,它的输出与页面设计完全不兼容,我的意思是它不可能做到这一点。

标签: php mysql wordpress


【解决方案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 修改的。

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

【讨论】:

  • 函数 get_all_category_ids 已被弃用,您的代码正在执行 3 个数据库查询(get_all_category_ids、get_posts 和 WP_Query),而我的代码正在执行 2 个数据库查询(get_categories 和 get_posts)。
  • @IagoMelanias:是的,无论哪种方式我都不太高兴。然而,这段代码让我可以用钩子安装它,而无需触及我的主模板。您的解决方案不使用主 WordPress 循环...请参阅我的编辑。
  • 是的,我不建议您使用我的代码,我只是更正您所说的信息。我只是建议您删除已弃用的功能。
  • 哦,我根本不想显得忘恩负义,也感谢您的提示,您可以看到我已经解决了这个问题。我现在只是非常强调可维护性。另外,我还在等待真正的 WordPress 大师发布更好的解决方案;)。
  • 是的。对于这种情况,最好的方法是运行一个复杂的 mysql 查询。这可以使用一个 mysql 查询来完成。
【解决方案2】:

未经测试,但这应该可以帮助您入门:

$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
}

【讨论】:

  • 好的,我遇到了一些问题,但无论如何这都会遇到一个主要问题:帖子不会按日期排序显示:它们将按类别排序。
  • 我明白你在说什么。是的,这将是一个问题,因为使用原生 Wordpress 函数/查询无法真正执行这种查询。即使是直接的 SQL 查询也会有点像野兽。您可以将每个查询的所有返回帖子存储到一个数组中,然后在事后进行排序,但这与直接查询相比效率有点低。
  • Mh.是的,我担心这会很棘手。我希望会有一些 WordPress API 调用,或者在没有调用的情况下,一些流行的插件已经解决了这个问题。 =/
  • @JeskoHüttenhain 我的答案已通过附加循环进行了编辑。这不是最好的解决方案,但我认为它应该有助于为您指明正确的方向。
【解决方案3】:

您只需要使用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 }

【讨论】:

  • 同样,这不会按日期排序帖子,而是按类别 =(.
  • 哇!好的,耐心等待 =)。
猜你喜欢
  • 2014-03-11
  • 2018-05-18
  • 1970-01-01
  • 2016-12-25
  • 2011-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多