Группировка результатов поиска по типам записей в WordPress
На моем сайте есть 3 уникальных типа записей:
- Стандартные записи блога ("post")
- Пользовательский тип "lesson" (уроки)
- Пользовательский тип "series" (серии)
Когда пользователь выполняет поиск по сайту, я хочу, чтобы релевантные результаты из всех 3 типов записей отображались на странице результатов поиска. Результаты "posts" должны быть в одном контейнере, "lesson" - в отдельном и т.д. Как можно модифицировать страницу поиска для реализации этого?
Вот мой текущий цикл:
<?php get_header(); ?>
<div class="row">
<div class="small-12 large-8 columns" role="main">
<?php do_action('foundationPress_before_content'); ?>
<h2><?php _e('Результаты поиска для', 'FoundationPress'); ?> "<?php echo get_search_query(); ?>"</h2>
<?php if ( have_posts() ) : ?>
<?php while ( have_posts() ) : the_post(); ?>
<?php if( get_post_type() == 'lesson' ) {
get_template_part('content', 'lesson');
} else if ( get_post_type() == 'post' ) {
get_template_part('content', get_post_format());
}
?>
<?php endwhile; ?>
<?php else : ?>
<?php get_template_part( 'content', 'none' ); ?>
<?php endif;?>
<?php do_action('foundationPress_before_pagination'); ?>
<?php if ( function_exists('FoundationPress_pagination') ) { FoundationPress_pagination(); } else if ( is_paged() ) { ?>
<nav id="post-nav">
<div class="post-previous"><?php next_posts_link( __( '← Старые записи', 'FoundationPress' ) ); ?></div>
<div class="post-next"><?php previous_posts_link( __( 'Новые записи →', 'FoundationPress' ) ); ?></div>
</nav>
<?php } ?>
<?php do_action('foundationPress_after_content'); ?>
</div>
<?php get_sidebar(); ?>
<?php get_footer(); ?>
Вы можете запускать один и тот же цикл несколько раз, используя rewind_posts()
для вывода каждого типа записей отдельно.
if( have_posts() ){
$types = array('post', 'lesson', 'series');
foreach( $types as $type ){
echo 'ваш контейнер открывается здесь для ' . $type;
while( have_posts() ){
the_post();
if( $type == get_post_type() ){
get_template_part('content', $type);
}
}
rewind_posts();
echo 'ваш контейнер закрывается здесь для ' . $type;
}
}

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

да, так я и предполагал, и именно для этого нужен этот пример. Ты можешь поместить любую разметку контейнера между циклами foreach
и while
.

А, понятно, с учетом отредактированного поста, спасибо. Ты не знаешь, будет ли это правильно работать с пагинацией?

это просто отсортирует записи в пределах каждой страницы, а пагинация будет работать так же, как и без этого кода. Если цель - сортировать записи вместе на всех страницах, вам придется изменить запрос напрямую с помощью фильтра.

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

тогда для этого потребуется фильтр posts_orderby
и немного кастомного SQL. К сожалению, я не могу написать это сходу.

здесь это сделано с помощью SQL.
