¿Mostrar la primera publicación de cada uno de los 3 diferentes tipos de publicaciones en una página web?

4

Tengo 3 tipos diferentes de publicaciones personalizadas: 1.) "events" , 2.) "winners" y 3.) "offers" . ¿Qué debo hacer para recuperar la primera (última) publicación de cada uno de estos tipos de publicación en una sola página web (es decir, una página de inicio)?

¿Usaré get_posts() o tendré que manipular the_loop() ?

    
pregunta dotty 05.10.2010 - 18:01

2 respuestas

3

Sí, get_posts es la forma más segura de usar varios bucles. No se confunde con la consulta original.

Otra forma sería crear nuevos objetos WP_Query:

$my_query = new WP_Query($args);
while ($my_query->have_posts()) : $my_query->the_post();

Nota: ¿Por qué no debe usar query_posts ( )

    
respondido por el sorich87 05.10.2010 - 21:23
1

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:

respondido por el MikeSchinkel 06.10.2010 - 10:40

Lea otras preguntas en las etiquetas