Страница с результатами пользовательского поиска

11 мая 2015 г., 12:25:13
Просмотры: 77.6K
Голосов: 3

что я сделал,

я создал search.php

<?php get_header(); ?>
<div class="wapper">
  <div class="contentarea clearfix">
    <div class="content">
      <h1 class="search-title"> <?php echo $wp_query->found_posts; ?>
        <?php _e( 'Найдено результатов поиска', 'locale' ); ?>: "<?php the_search_query(); ?>" </h1>
      <ul>
        <?php query_posts('showposts=3'); if (have_posts()) : ?>
        <li>
          <h3><a href="<?php echo get_permalink(); ?>">
            <?php the_title();  ?>
            </a></h3>
          <?php  the_post_thumbnail('medium') ?>
          <?php echo substr(get_the_excerpt(), 0,200); ?>
          <div class="h-readmore"> <a href="<?php the_permalink(); ?>">Читать далее</a></div>
        </li>
        <?php endif ?>
      </ul>
    </div>
  </div>
</div>
<?php get_footer(); ?>

затем создал searchform.php

<form action="<?php bloginfo('siteurl'); ?>" id="searchform" method="get">
  <input type="search" id="searchbox" name="s" placeholder="Введите ключевые слова" required>
    <input type="image" id="searchsubmit" alt="Поиск" class="searchicon" src="<?php bloginfo( 'template_url' ); ?>/images/icon-search.gif" />
</form>

но на моей странице результатов не отображается описание содержимого и показывается только один результат. хотя в заголовке H1 показывается 2/3/5/6/7 и т.д. найденных результатов поиска. я хочу показывать как минимум 10 результатов на странице с пагинацией, а также показывать 200/300 символов текста содержимого для результатов поиска. ребята, можете помочь. я еще не эксперт в wp

0
Все ответы на вопрос 2
6
10

У меня есть несколько рекомендаций по вашему вопросу:

Во-первых: перестаньте использовать query_posts(). Ознакомьтесь с документацией об этой функции, чтобы понять, почему её не следует использовать в темах или плагинах. Тем не менее, если вы оказались в странной ситуации, когда у вас нет другого выхода и вам нужно использовать query_posts(), после цикла вы должны запустить wp_reset_query(). Вы должны понимать, что используете global $wp_query, который содержит оригинальный запрос WordPress, а query_post изменяет переменную global $wp_query, что может привести к неожиданным результатам. Кроме того, вы используете устаревший параметр showposts, который был заменён на posts_per_page.

Во-вторых: вы можете использовать пользовательский шаблон поиска (search.php) для настройки внешнего вида. Просто создайте файл search.php в папке вашей темы и настройте его по своему усмотрению. Не делайте здесь пользовательские запросы; если вы это сделаете, вы создадите новый запрос для постов и потратите впустую запрос, уже выполненный WordPress. Это приведёт к потере ресурсов и негативно скажется на производительности.

В-третьих: чтобы изменить параметры запроса по умолчанию, используемые WordPress, такие как количество постов на странице и т.д., вы можете использовать действие pre_get_posts.

Итак, создайте шаблон search.php по своему усмотрению и используйте действие pre_get_posts, чтобы указать WordPress, какие параметры вы хотите использовать в поисковом запросе:

Шаблон search.php может выглядеть примерно так:

<?php
get_header();
global $wp_query;
?>
<div class="wapper">
  <div class="contentarea clearfix">
    <div class="content">
      <h1 class="search-title"> <?php echo $wp_query->found_posts; ?>
        <?php _e( 'Результаты поиска для', 'locale' ); ?>: "<?php the_search_query(); ?>" </h1>

        <?php if ( have_posts() ) { ?>

            <ul>

            <?php while ( have_posts() ) { the_post(); ?>

               <li>
                 <h3><a href="<?php echo get_permalink(); ?>">
                   <?php the_title();  ?>
                 </a></h3>
                 <?php  the_post_thumbnail('medium') ?>
                 <?php echo substr(get_the_excerpt(), 0,200); ?>
                 <div class="h-readmore"> <a href="<?php the_permalink(); ?>">Читать далее</a></div>
               </li>

            <?php } ?>

            </ul>

           <?php echo paginate_links(); ?>

        <?php } ?>

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

А действие pre_get_posts может выглядеть так:

add_action( 'pre_get_posts', function( $query ) {

    // Проверяем, что это нужный нам запрос: поисковый запрос на фронтенде
    if( $query->is_main_query() && ! is_admin() && $query->is_search() ) {

        // Изменяем параметры запроса
        $query->set( 'posts_per_page', 3 );

    }

} );
11 мая 2015 г. 14:17:12
Комментарии

Не совсем необходимо использовать global $wp_query в контексте шаблона, можно просто использовать объект $wp_query там, где это нужно, но, наверное, лучше перестраховаться :-)

Pieter Goosen Pieter Goosen
11 мая 2015 г. 14:59:48

Я не был уверен в этом, поэтому включил глобальную ссылку. Спасибо за заметку.

cybmeta cybmeta
11 мая 2015 г. 15:33:41

@cybmeta спасибо, работает отлично. Еще раз спасибо. Если вы не против, не могли бы вы подсказать, как добавить пагинацию?

pagol001 pagol001
11 мая 2015 г. 23:41:48

@PieterGoosen так ты думаешь, мне лучше заменить global $wp_query; на $wp_query;?

pagol001 pagol001
11 мая 2015 г. 23:44:05

Я не включил пагинацию, потому что у тебя её не было в коде, я просто скопировал твой код без части с кастомным запросом. Ты можешь использовать любую из функций, предоставляемых WordPress для пагинации множества записей.

cybmeta cybmeta
12 мая 2015 г. 00:36:53

Нет, можешь оставить как есть :-).

Pieter Goosen Pieter Goosen
12 мая 2015 г. 06:47:46
Показать остальные 1 комментариев
2

Вам необходимо запустить цикл, измените ваш файл search.php примерно следующим образом:

  <?php get_header();?>

    <div class="wapper">
      <div class="contentarea clearfix">
        <div class="content">
            <ul>
                <?php if ( have_posts() ) : ?>

            <header class="page-header">
                <p><?php printf( __( 'Результаты поиска для: %s', 'twentyfourteen' ), get_search_query() ); ?></p>
            </header><!-- .page-header -->

                        <?php
                        // Начало цикла
                        while ( have_posts() ) : the_post();
                        ?>
                        <li><h3><a href="<?php the_permalink() ?>"><?php the_title(); ?></a></h3></li>
                        <?php the_post_thumbnail('medium') ?>
                        <?php echo substr(get_the_excerpt(), 0, 200); ?>
                            <div class="h-readmore"> 
                                <a href="<?php the_permalink(); ?>">Читать далее</a>
                            </div>
                        <?php
                        endwhile;
                else :
                // Если контент не найден, подключаем шаблон "Нет записей"
                get_template_part( 'content', 'none' );
                endif;
                ?>       
            </ul>                                 

        </div>
      </div>
    </div>
<?php get_footer(); ?>
11 мая 2015 г. 12:40:27
Комментарии

В приведенном выше коде замените 'twentyfourteen' на текстовый домен вашей темы

shuvroMithun shuvroMithun
11 мая 2015 г. 12:53:53

спасибо. если выдает ошибку Parse error: syntax error, unexpected end of file in .../search.php on line 34

pagol001 pagol001
11 мая 2015 г. 23:45:34