Mostrar o primeiro post de cada um dos 3 diferentes tipos de postagem em uma página da Web?

4

Eu tenho três tipos diferentes de postagem personalizada: 1.) "events" , 2.) "winners" e 3.) "offers" . Como eu faria para recuperar a primeira (mais recente) postagem em cada um desses tipos de postagem em uma única página da Web (por exemplo, uma página inicial).

Eu usaria get_posts() ou precisaria manipular the_loop() ?

    
por dotty 05.10.2010 / 18:01

2 respostas

3

Sim, get_posts é a maneira mais segura de usar vários loops. Não atrapalha com a consulta original.

Outra maneira seria criar novos objetos WP_Query:

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

Nota: Por que você não deve usar query_posts ( )

    
por sorich87 05.10.2010 / 21:23
1

Oi @dotty:

A resposta de @ sorich87 está correta, mas eu pensei em elaborar um pouco. Eu codifiquei uma classe para você chamada (verbosely) LatestPostPerPostTypeQuery e você pode usá-la em loop no lugar de WP_Query , assim:

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

Abaixo está o código para a classe LatestPostPerPostTypeQuery , que você pode copiar no arquivo functions.php do seu tema (ou usar o código em um plugin, se quiser.) O interessante dessa alternativa para WP_Query é uma consulta única ao banco de dados em vez de um para cada um dos três tipos de post como você seria forçado a usar ao usar WP_Query() diretamente.

<?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();

Eu também publiquei um arquivo autônomo no Gist , permitindo que você pegue o código-fonte e solte o exemplo em um arquivo na raiz do seu website para chamá-lo diretamente do navegador para assisti-lo em ação:

por MikeSchinkel 06.10.2010 / 10:40