Hola @dotty:
La respuesta de @ sorich87 es correcta, pero pensé que me gustaría elaborar un poco. He codificado una clase para ti llamada (verbosely) LatestPostPerPostTypeQuery
y puedes usarla en the bucle en lugar de WP_Query
, así:
<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>
A continuación se muestra el código para la clase LatestPostPerPostTypeQuery
que puede copiar en el archivo functions.php
de su tema (o use el código en un complemento si lo desea). Lo bueno de esta alternativa a WP_Query
es que realiza una consulta única a la base de datos en lugar de una para cada uno de los tres tipos de publicación que se verá obligado a usar cuando use WP_Query()
directamente.
<?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();
También he publicado un archivo independiente en Gist que te permite capturar el código fuente y soltarlo el ejemplo en un archivo en la raíz de su sitio web para llamarlo directamente desde el navegador para verlo en acción: