你好@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 允许您获取源代码并将示例放入网站根目录中的文件中,以便直接从浏览器调用该示例以查看其实际操作: