Intereting Posts
Пользовательский URL-адрес типа сообщения Преобразование виджетам темы в плагины? скрыть или отключить кнопку в менеджере заданий wp Почему несколько текстовых прерываний перестали работать в текстовом редакторе? Получение разбивки на страницы для второго цикла для работы на single.php Повторное использование переменной в обратном вызове Feedburner не обновляется, когда публикуется «запланированная публикация» обычная запись single.php, отображаемая дважды Добавить класс в текущую должность в query_post Что приводит к ухудшению качества изображения? отображать один пост из каждой настраиваемой категории (иначе говоря, «термин пользовательской таксономии») Как «заменить функцию через плагины» в WordPress? Плагин мета-слайдера работает только после первого обновления – у объекта нет метода «слайдер flex», Шаблон контента при добавлении новой страницы Выход и перенаправление с использованием меню WP

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

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

Я бы использовал get_posts() или мне пришлось бы манипулировать the_loop() ?

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

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

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

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

Привет @dotty:

Ответ от @ sorich87 верен, но я подумал, что немного поразмыслил. Я закодировал класс, для которого вы вызвали (verbosely) 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, позволяя вам захватить исходный код и отбросить этот пример в файл в корневом каталоге вашего веб-сайта, чтобы вызвать его непосредственно из браузера, чтобы посмотреть его в действии:

  • последнего пост-за пост-типа-query.php