Пагинация не работает с шаблоном результатов поиска

18 июл. 2013 г., 12:36:09
Просмотры: 13.6K
Голосов: 0

У меня не получается заставить пагинацию корректно работать в шаблоне результатов поиска. Ссылки на страницы отображаются, но при переходе на страницу 2 возникает ошибка 404.

Search.php

<?php
global $wp_query;
$total_results = $wp_query->found_posts;
?>

<?php
if(!$wp_query) global $wp_query;
$search_refer = $_GET["post_type"];
if ($search_refer == 'archive') { load_template(TEMPLATEPATH . '/search-gallery.php');}
else{load_template(TEMPLATEPATH . '/search-standard.php');}
?>

Код пагинации в Functions.php

function pagination($pages = '', $range = 4){  
 $showitems = ($range * 2)+1;  

 global $paged;
 if(empty($paged)) $paged = 1;

 if($pages == '')
 {
     global $wp_query;
     $pages = $wp_query->max_num_pages;
     if(!$pages)
     {
         $pages = 1;
     }
 }   

 if(1 != $pages)
 {
     echo "<div class=\"pagination\"><span>Страница ".$paged." из ".$pages."</span>";
     if($paged > 2 && $paged > $range+1 && $showitems < $pages) echo "<a href='".get_pagenum_link(1)."'>&laquo; Первая</a>";
     if($paged > 1 && $showitems < $pages) echo "<a href='".get_pagenum_link($paged - 1)."'>&lsaquo; Предыдущая</a>";

     for ($i=1; $i <= $pages; $i++)
     {
         if (1 != $pages &&( !($i >= $paged+$range+1 || $i <= $paged-$range-1) || $pages <= $showitems ))
         {
             echo ($paged == $i)? "<span class=\"current\">".$i."</span>":"<a href='".get_pagenum_link($i)."' class=\"inactive\">".$i."</a>";
         }
     }

     if ($paged < $pages && $showitems < $pages) echo "<a href=\"".get_pagenum_link($paged + 1)."\">Следующая &rsaquo;</a>";  
     if ($paged < $pages-1 &&  $paged+$range-1 < $pages && $showitems < $pages) echo "<a href='".get_pagenum_link($pages)."'>Последняя &raquo;</a>";
     echo "</div>\n";
 }
}

Шаблон результатов поиска

<?php
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
$search_query = array(
    'posts_per_page' => '10',
    'paged' => $paged,
    );
$wp_query = new WP_Query($search_query);

if ($wp_query->have_posts()) : while ($wp_query->have_posts()) : $wp_query->the_post(); ?>

<div class="courseContent coursesLayout alumniMainContent alumniSpacing newsBoxMore">
    <div class="courseContentHolder alumniContentHolder newsBoxMainHolder">
        <div class="newsMainImage">
            <?php the_post_thumbnail(); ?>
        </div>

        <div class="alumniHeading newsMainHeading">
            <h5><?php the_title();?></h5>
        </div>

        <div class="alumniContent newsMainContent">
            <?php the_excerpt(); ?> 
        </div>
    </div>
    <span class="readmoreButton" style="display: inline !important;"><a title="Награды студентов" href="<?php the_permalink();?>">Читать далее</a></span>
</div><?php edit_post_link('Редактировать'); ?>
<?php endwhile; ?><?php else : ?>       
    <p class="notfoundtext">Извините, ничего не найдено по вашему запросу. Попробуйте еще раз?</p>
<?php endif; ?>     

<?php pagination(); ?>

Есть какие-нибудь предложения?

1
Комментарии

Это помечено как дубликат, но нет ссылки на другой ответ.

strattonn strattonn
31 окт. 2014 г. 00:35:33
Все ответы на вопрос 2
1

Если первая страница повторяется, это обычно проблема с wp_query. Ошибка 404 связана с постоянными ссылками — попробуйте установить их по умолчанию и проверить, сохраняется ли проблема. Если нет, верните настройки обратно на пользовательские, и проблема должна исчезнуть.

Если при стандартных постоянных ссылках вы получаете 404 на второй странице, нужно внимательнее изучить код пагинации. Лично я рекомендую код Джастина Тадлока, так как он безупречен.

https://github.com/justintadlock/hybrid-core/blob/master/extensions/loop-pagination.php

18 июл. 2013 г. 13:08:30
Комментарии

Я изменил структуру постоянных ссылок обратно на стандартную, но проблема с ошибкой 404 осталась. Затем я попробовал код Джастина Тадлока, но он ведет себя странно: страница 1 повторяется, и ссылка на страницу 1 подсвечивается, независимо от того, на какой странице я нахожусь!

RoseCoder RoseCoder
18 июл. 2013 г. 13:24:43
7

Вы перезаписываете $wp_query внутри шаблона поиска. Это означает, что основной запрос, который выполняется до загрузки вашего шаблона поиска, будет рассинхронизирован с $wp_query в шаблоне. Это часто приводит к ошибкам 404.

Поскольку единственное, что вы делаете, это изменяете параметр posts_per_page, очень простой callback для pre_get_posts исправит как минимум часть проблемы.

function alter_search_ppp_wpse_106961($qry) {
  if ($qry->is_main_query() && $qry->is_search()) {
    $qry->set('post_per_page',10);
  }
}
add_action('pre_get_posts','alter_search_ppp_wpse_106961');

С этим кодом вам больше не нужно (и следует удалить) следующее:

$search_query = array(
    'posts_per_page' => '10',
    'paged' => $paged,
    );
$wp_query = new WP_Query($search_query);

Я не знаю, почему вы реализовали собственную пагинацию, и не могу сказать, будет ли этот код генерировать проблемные URL, но я бы предложил вам ознакомиться с функцией paginate_links

18 июл. 2013 г. 17:08:30
Комментарии

Спасибо, я подумал, что это могло перезаписать $wp_query. Я попробовал pre_get_posts, но это не дало никакого эффекта

RoseCoder RoseCoder
19 июл. 2013 г. 10:35:33

"не дало никакого эффекта" - не очень информативно.

s_ha_dum s_ha_dum
19 июл. 2013 г. 16:35:45

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

RoseCoder RoseCoder
19 июл. 2013 г. 21:11:32

Какое имя у вашего файла шаблона поиска .php?

s_ha_dum s_ha_dum
19 июл. 2013 г. 21:22:16

У меня есть search.php, который содержит код из моего первоначального вопроса, он перенаправляет на два других шаблона, и тот, на котором я хочу, чтобы работала пагинация, называется search-standard.php

RoseCoder RoseCoder
19 июл. 2013 г. 21:27:42

Попробуйте снова. Была опечатка. Если это все еще не работает, то, вероятно, условие is_search не выполняется из-за того, как вы переключаете шаблоны.

s_ha_dum s_ha_dum
19 июл. 2013 г. 21:39:25

Спасибо, пробовал и тестировал, но безрезультатно! Возможно, я заброшу эту идею, но огромное спасибо за вашу помощь, очень ценю её!

RoseCoder RoseCoder
19 июл. 2013 г. 22:13:23
Показать остальные 2 комментариев