Группировка результатов поиска по типам записей в WordPress

20 мар. 2015 г., 18:08:34
Просмотры: 14.8K
Голосов: 9

На моем сайте есть 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( __( '&larr; Старые записи', 'FoundationPress' ) ); ?></div>
            <div class="post-next"><?php previous_posts_link( __( 'Новые записи &rarr;', 'FoundationPress' ) ); ?></div>
        </nav>
    <?php } ?>

    <?php do_action('foundationPress_after_content'); ?>

    </div>
    <?php get_sidebar(); ?>

<?php get_footer(); ?>
2
Комментарии

Не используйте elseif, используйте только if. Таким образом, все шаблоны будут отображены.

Ciprian Ciprian
20 мар. 2015 г. 18:52:38

Я не думаю, что выбор между if и elseif здесь что-то изменит.

s_ha_dum s_ha_dum
25 мар. 2015 г. 18:04:04
Все ответы на вопрос 1
8
21

Вы можете запускать один и тот же цикл несколько раз, используя 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;
    }
}
20 мар. 2015 г. 20:54:48
Комментарии

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

tdc tdc
21 мар. 2015 г. 03:01:27

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

Milo Milo
21 мар. 2015 г. 03:54:51

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

tdc tdc
23 мар. 2015 г. 15:55:46

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

Milo Milo
23 мар. 2015 г. 17:36:40

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

tdc tdc
23 мар. 2015 г. 17:41:19

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

Milo Milo
23 мар. 2015 г. 18:02:43

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

honk31 honk31
26 авг. 2016 г. 12:42:45

То, что я искал, спасибо. Как добавить orderby к этому?

Mike Mike
22 мая 2017 г. 14:40:10
Показать остальные 3 комментариев