it-swarm.dev

Zobrazit první příspěvek z každé ze 3 různých typů příspěvků na webové stránce?

Mám 3 různé typy vlastních příspěvků: 1.) "events", 2.) "winners" a 3.) "offers". Jak bych mohl jít o získání prvního (posledního) příspěvku v každém z těchto typů příspěvků na jedné webové stránce (tj. Domovské stránce).

Mohl bych použít get_posts() nebo bych musel manipulovat s the_loop()?

4
dotty

Ano, get_posts je nejbezpečnější způsob použití více smyček. Nepořádá se s původním dotazem.

Dalším způsobem by bylo vytvořit nové objekty WP_Query:

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

Poznámka: Proč byste neměli používat query_posts ()

3
sorich87

Ahoj @ dotty:

Odpověď z @ sorich87je správná, ale myslel jsem, že bych to trochu rozvedl. Kódoval jsem třídu, kterou jste nazvali (podrobně)LatestPostPerPostTypeQuery a můžete ji použít v smyčce namísto 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>

Níže je uveden kód třídy LatestPostPerPostTypeQuery, který můžete zkopírovat do souboru functions.php vašeho motivu (nebo použijte kód v zásuvném modulu, pokud se vám líbí.)The Nice věc o této alternativě k WP_Query je to dělá jeden dotazk databázi místo jeden pro každý tři typy poštyjako vy byste byli nucení používat při použití\t WP_Query() přímo.

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

Také jsem zveřejnil samostatný soubor na Gist , který vám umožní chytit zdrojový kód a zrušit příklad do souboru v kořenovém adresáři vašich webových stránek, abyste ho mohli přímo vyvolat z prohlížeče, abyste si ho mohli prohlédnout v akci:

1
MikeSchinkel