it-swarm.com.de

Den ersten Beitrag von jedem der drei verschiedenen Beitragstypen auf einer Webseite anzeigen?

Ich habe 3 verschiedene benutzerdefinierte Beitragstypen: 1.) "events", 2.) "winners" und 3.) "offers". Wie würde ich vorgehen, um den ersten (neuesten) Beitrag in jedem dieser Beitragstypen auf einer einzelnen Webseite (d. H. Einer Homepage) abzurufen?.

Würde ich get_posts() verwenden oder müsste ich the_loop() manipulieren?

4
dotty

Ja, get_posts ist der sicherste Weg, mehrere Schleifen zu verwenden. Die ursprüngliche Abfrage wird nicht durcheinander gebracht.

Eine andere Möglichkeit wäre, neue WP_Query-Objekte zu erstellen:

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

Hinweis: Warum Sie query_posts () nicht verwenden sollten

3
sorich87

Hallo @ dotty:

Die Antwort von @ sorich87ist richtig, aber ich dachte, ich würde etwas näher darauf eingehen. Ich habe für Sie eine Klasse mit dem Namen (wörtlich)LatestPostPerPostTypeQuery programmiert, die Sie in der Schleife verwenden können anstelle von WP_Query, wie folgt:

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

Unten ist der Code für die Klasse LatestPostPerPostTypeQuery, den Sie in die Datei functions.php Ihres Themas kopieren können (oder den Code in einem Plugin verwenden, wenn Sie möchten.)Das Schöne an dieser Alternative zu WP_Query ist Es führt eine einzelne Abfragean die Datenbank aus, anstatt eine für jeden der drei Beitragstypen, zu deren Verwendung Sie gezwungen wären WP_Query() direkt.

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

Ich habe auch eine eigenständige Datei auf Gist gepostet , mit der Sie den Quellcode abrufen und das Beispiel löschen können in eine Datei im Stammverzeichnis Ihrer Website, um sie direkt vom Browser aus aufzurufen und in Aktion zu sehen:

1
MikeSchinkel