Пагинация не работает с шаблоном результатов поиска
У меня не получается заставить пагинацию корректно работать в шаблоне результатов поиска. Ссылки на страницы отображаются, но при переходе на страницу 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)."'>« Первая</a>";
if($paged > 1 && $showitems < $pages) echo "<a href='".get_pagenum_link($paged - 1)."'>‹ Предыдущая</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)."\">Следующая ›</a>";
if ($paged < $pages-1 && $paged+$range-1 < $pages && $showitems < $pages) echo "<a href='".get_pagenum_link($pages)."'>Последняя »</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(); ?>
Есть какие-нибудь предложения?
Если первая страница повторяется, это обычно проблема с wp_query. Ошибка 404 связана с постоянными ссылками — попробуйте установить их по умолчанию и проверить, сохраняется ли проблема. Если нет, верните настройки обратно на пользовательские, и проблема должна исчезнуть.
Если при стандартных постоянных ссылках вы получаете 404 на второй странице, нужно внимательнее изучить код пагинации. Лично я рекомендую код Джастина Тадлока, так как он безупречен.
https://github.com/justintadlock/hybrid-core/blob/master/extensions/loop-pagination.php

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

Вы перезаписываете $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

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

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

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

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