dotty
  • 0
Новичок

Показать первое сообщение каждого из 3 разных типов сообщений на веб-странице?

  • 0

У меня есть 3 разных пользовательских типа сообщений: 1.) "events", 2.) "winners" и 3.) "offers" . Как мне получить первое (последнее) сообщение в каждом из этих типов сообщений на одной веб-странице (т.е. домашней странице).

Буду ли я использовать get_posts() или мне придется манипулировать the_loop() ?

Share
  1. Да, get_posts — это самый безопасный способ использования нескольких циклов. Это не испортит исходный запрос.

    Другой способ — создать новые объекты WP_Query:

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

    Примечание. Почему не следует использовать query_posts()

    • 0
  2. Привет @dotty:

    Ответ от @sorich87 правильный, но я подумал, что немного уточню. Я закодировал для вас класс под названием (подробно) LatestPostPerPostTypeQuery , и вы можете использовать его в цикле вместо 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>
    

    Ниже приведен код LatestPostPerPostTypeQuery класса, который вы можете скопировать в functions.php файл вашей темы (или использовать код в плагине, если хотите). Прелесть этой альтернативы в WP_Query том, что она делает один запрос к базе данных вместо одного для каждого из три типа сообщений, которые вы были бы вынуждены использовать при WP_Query() прямом использовании.

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

    Я также разместил отдельный файл на Gist, позволяющий вам взять исходный код и поместить пример в файл в корневом каталоге вашего веб-сайта, чтобы вызвать его непосредственно из браузера и посмотреть, как он работает:

    • 0

Оставить ответ

You must login to add an answer.