пользовательские результаты поиска – оформлять результаты по-разному по типу сообщения

я честно посмотрел вокруг, прежде чем публиковать это, и я не получаю много удачи. Вот сценарий. У меня есть поисковый запрос, который извлекает обычные сообщения и два дополнительных пользовательских типа сообщений (запросы дистрибьюторов и события) и отображает результаты, разделенные на свои собственные div, используя цикл foreach, таким образом:

if( have_posts() ){ $types = array('post', 'tribe_events', 'distribute'); $counter = 1; foreach( $types as $type ){ echo '<div class="results '; echo $type. '">'; if($type == 'post'){ echo '<h4><i class="fa fa-newspaper-o"></i> Articles</h4>'; } if($type == 'distribute'){ echo '<h4><i class="fa fa-truck"></i> Distributors Wanted</h4>'; } if($type == 'tribe_events'){ echo '<h4 class="events">Events</h4>'; } echo '<ul class="looplist">'; while( have_posts() ){ the_post(); if( $type == get_post_type() ){ get_template_part('parts/search', $type); } $counter++ ; } rewind_posts(); echo '</ul></div>'; } 

Это все работает нормально, извлечение выбранных частей, но есть две проблемы, я не уверен, как обращаться. 1: потому что он сортирует результаты по дате по возрастанию (по умолчанию), это не очень хорошо работает для событий (которые обрабатываются «календарем событий» Modern Tribe ) – поскольку они публикуются в произвольные даты, когда списки входят в , но имеют конкретную мета-ценность для дат начала, которую я хотел бы заказать, если это возможно. я использовал запрос для этого в обычном WP_query, например:

 'meta_key'=>'_EventStartDate', 'orderby'=>'_EventStartDate', 'order'=>'ASC', 

2: поскольку код использует цикл foreach, я не уверен, как подойти к скрытию пустых результатов, что означает, что даже если результаты не будут возвращены для типа post, он все равно отображает заголовок и контейнер div.

Может ли кто-нибудь предложить решение? я сделал onder об условном пропускании $ args для каждого типа сообщения, но я попробовал несколько вещей, и все, что у меня было, было головной болью и белым экраном. Извините, если моя нехватка знаний является препятствием здесь, я относительный новичок! Ура! Пит

Нижеследующее должно зацикливать ваши типы сообщений и только вставлять заголовок один раз, если у него есть сообщение для этого типа сообщения. Я уверен, что есть намного лучшие способы кодировать этот чист, но это должно работать. * Я не тестировал только кодировку на этой странице.

Я не уверен в заказе специального атрибута типа сообщения, так как я не знаю, что плагин и ваш запрос выглядят правильно, возможно, стоит попробовать без _, как я сделал это в Advanced Custom Fields, и не требовал _.

стоит проверить вашу базу данных, поскольку я знаю, что дополнительные пользовательские поля сохраняют даты, подобные этому 03212017, и WordPress, возможно, не сможет увидеть это как действительную дату.

  if (have_posts()) : $counter = 1; $post_counter_1 = 0; $post_counter_2 = 0; $post_counter_3 = 0; while ( have_posts() ) : the_post(); // Get post type to display if(get_post_type() == 'post'){ // run once for creating header if($post_counter_1 == 0) { $post_counter_1 = 1; echo '<h4><i class="fa fa-newspaper-o"></i> Articles</h4>'; } echo '<div class="results post">'; get_template_part('parts/search', 'post'); } endwhile; while ( have_posts() ) : the_post(); if(get_post_type() == 'tribe_events'){ if($post_counter_2 == 0) { $post_counter_2 = 1; echo '<h4><i class="fa fa-truck"></i> Distributors Wanted</h4>'; } echo '<div class="results tribe_events">'; get_template_part('parts/search', 'tribe_events'); } endwhile; while ( have_posts() ) : the_post(); if(get_post_type() == 'distribute'){ if($post_counter_3 == 0) { $post_counter_3 = 1; echo '<h4 class="events">Events</h4>'; } echo '<div class="results distribute">'; get_template_part('parts/search', 'distribute'); } endwhile; endif;