在网页上显示3种不同帖子类型中的第一个帖子?

时间:2010-10-05 作者:dotty

我有3种不同的自定义帖子类型:1。)"events", 2.) "winners" 3.)"offers". 如何在单个网页(即主页)上检索这些帖子类型中的第一篇(最新)帖子。

我会使用get_posts() 还是我必须操纵the_loop()?

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

get_posts 是使用多个循环最安全的方法。它不会打乱原始查询。

另一种方法是创建新的WP\\U查询对象:

$my_query = new WP_Query($args);
while ($my_query->have_posts()) : $my_query->the_post();
注:Why you should not use query_posts()

SO网友:MikeSchinkel

你好@dotty:

sorich87的回答是正确的,但我想我应该详细说明一下。我为您编写了一个名为(详细地)的类LatestPostPerPostTypeQuery 你可以在the loop 代替WP_Query, 像这样:

<ul>
<?php $args = array(\'post_type\'=>\'events,winners,offers\'); ?>
<?php $query = new LatestPostPerPostTypeQuery($args); ?>
<?php while($query->have_posts()): $query->the_post(); ?>
  <li><?php the_title(); ?></li>
<?php endwhile; ?>
</ul>
以下是LatestPostPerPostTypeQuery 类,您可以将其复制到主题的functions.php 文件(如果愿意,也可以使用插件中的代码。)WP_Query 它是对数据库进行单一查询,而不是像使用WP_Query() 直接地

<?php
class LatestPostPerPostTypeQuery extends WP_Query {
  var $flag;
  function __construct($args=array()) {
    $this->LatestPostPerPostTypeQuery($args);
  }
  function LatestPostPerPostTypeQuery($args=array()) {
    if (isset($args[\'post_type\']) && !is_array($args[\'post_type\']))
      $args[\'post_type\'] = explode(\',\',$args[\'post_type\']);
    $this->flag = true;
    parent::query($args);
  }
  static function on_load() {
    add_filter(\'posts_join\',array(__CLASS__,\'posts_join\'),10,2);
  }
  static function posts_join($join,$query) {
    if (isset($query->flag)) {
      global $wpdb;
      $join .=<<<SQL
INNER JOIN (
SELECT post_type,MAX(post_date) AS post_date
FROM {$wpdb->posts}
GROUP BY post_type) max_date ON 
  max_date.post_type={$wpdb->posts}.post_type AND 
  max_date.post_date={$wpdb->posts}.post_date
SQL;
    }
    return $join;
  }
}
LatestPostPerPostTypeQuery::on_load();
我还发布了a standalone file on Gist 允许您获取源代码并将示例放入网站根目录中的文件中,以便直接从浏览器调用该示例以查看其实际操作:

结束

相关推荐