paginate_links() неправильно работает в search.php?
Я использую это в моем search.php шаблоне ...
<div class="pagination">
<?php echo get_pagination_links(); ?>
</div>
И вот эта функция ...
function get_pagination_links() {
global $wp_query;
$big = 999999999;
return paginate_links( array(
'base' => str_replace( $big, '%#%', esc_url( get_pagenum_link( $big ) ) ),
'format' => '?paged=%#%',
'current' => max( 1, get_query_var('paged') ),
'total' => $wp_query->max_num_pages,
'prev_next' => false
) );
}
-
Вывод работает: Если я ищу "test" и есть больше 10 результатов, пагинация показывает 1 2
, где 2
это ссылка. При клике на страницу 2
адресная строка правильно обновляется на mysite.com/search/test/page/2
, но отображаемая страница все еще номер 1
.
Все еще отображаются те же результаты, что и на странице номер 1
, и ссылки пагинации остаются теми же - 2
все еще ссылка, а 1
текущая страница.
Есть идеи, почему это может происходить?
Обновление
Вот где вызывается пользовательская функция в шаблоне:
<?php
/**
* Шаблон для отображения страниц результатов поиска
*/
get_header(); ?>
<?php if ( have_posts() ) : ?>
<hgroup class="section-heading wrapper">
<h1>Результаты</h1>
</hgroup>
<section id="results">
<?php while ( have_posts() ) : the_post(); ?>
<ul class="event-items">
<?php get_template_part( 'inc/search', 'result' ); ?>
</ul>
<?php endwhile; ?>
</section>
<div class="pagination tiny wrapper">
<?php echo get_pagination_links(); ?>
</div>
<?php else : ?>
<div class="wrapper">
<h2>Ничего не найдено</h2>
</div>
<?php endif; ?>
<?php get_footer(); ?>
Редактирование
Использование рекомендованного кода из ответа ниже:
/**
* Ссылки пагинации для поиска и архивов
*/
function get_pagination_links() {
global $wp_query;
$wp_query->query_vars['paged'] > 1 ? $current = $wp_query->query_vars['paged'] : $current = 1;
$big = 999999999;
return paginate_links( array(
'base' => @add_query_arg('paged','%#%'),
'format' => '?paged=%#%',
'current' => $current,
'total' => $wp_query->max_num_pages,
'prev_next' => false
) );
}
Пагинация теперь работает, однако "постоянные ссылки" не совсем такие, какими я хочу их видеть. Я использую custom_pagination_base()
, чтобы иметь такую структуру постоянных ссылок:
mypage.com/search/term/seite/2
(где seite - это немецкое слово для page).
Возможно ли сохранить работу постоянных ссылок таким образом? Пагинация работает с вашим кодом, просто постоянные ссылки выглядят так:
mypage.com/search/term?paged=2

Я почти уверен, что это уже где-то обсуждалось, но повторю здесь снова.
Полагаю, ваша проблема заключается здесь:
'current' => max( 1, get_query_var('paged') ),
Попробуйте вместо этого:
global $wp_query;
$wp_query->query_vars['paged'] > 1 ? $current = $wp_query->query_vars['paged'] : $current = 1;
...а затем:
'current' => $current;
Ваш параметр 'base'
также может быть причиной проблемы. Вместо этого:
$big = 999999999;
//...
'base' => str_replace( $big, '%#%', esc_url( get_pagenum_link( $big ) ) )
Я использую такую конструкцию:
'base' => @add_query_arg('paged','%#%')
Редактирование
Если это поможет, вот моя полная функция-обертка для paginate_links()
:
/**
* Пагинация ссылок на архивных страницах
*/
function oenology_get_paginate_archive_page_links( $type = 'plain', $endsize = 1, $midsize = 1 ) {
global $wp_query, $wp_rewrite;
$current = get_query_var( 'paged' ) > 1 ? get_query_var('paged') : 1;
// Проверка и очистка входных аргументов
if ( ! in_array( $type, array( 'plain', 'list', 'array' ) ) ) $type = 'plain';
$endsize = absint( $endsize );
$midsize = absint( $midsize );
// Настройка массива аргументов для paginate_links()
$pagination = array(
'base' => @add_query_arg( 'paged', '%#%' ),
'format' => '',
'total' => $wp_query->max_num_pages,
'current' => $current,
'show_all' => false,
'end_size' => $endsize,
'mid_size' => $midsize,
'type' => $type,
'prev_text' => '<<',
'next_text' => '>>'
);
if ( $wp_rewrite->using_permalinks() )
$pagination['base'] = user_trailingslashit( trailingslashit( remove_query_arg( 's', get_pagenum_link( 1 ) ) ).'page/%#%/', 'paged' );
if ( ! empty( $wp_query->query_vars['s'] ) )
$pagination['add_args'] = array( 's' => get_query_var( 's' ) );
return paginate_links( $pagination );
}

Спасибо, сэр. Отлично, но есть последняя небольшая деталь. Я обновил свой вопрос выше с вашим кодом. Пагинация теперь работает, однако "постоянные ссылки" выглядят не совсем так, как я хочу. Я использую custom_pagination_base()
, чтобы получить структуру постоянных ссылок вида mypage.com/search/term/seite/2
, где seite
- это немецкое слово для страницы. Возможно ли сохранить работу постоянных ссылок в таком виде? Пагинация работает с вашим кодом, но ссылки выглядят так: mypage.com/search/term?paged=2

Смотрите обновленный ответ. Я добавил всю свою функцию. Также: будьте осторожны с редактированием вопроса. Если вы перезапишете исходный код, последующим читателям будет сложно следить за потоком вопрос-ответ. Обычно лучше сохранить исходный код и затем добавить новый код к вопросу. Я отредактирую ваш вопрос, чтобы показать, что я имею в виду.

Чтобы ответить на ваш конкретный дополнительный вопрос, обратите внимание на тернарный оператор $pagination['base']
ближе к концу функции. Я думаю, вы сможете адаптировать эту строку под свои нужды.

Спасибо, но у меня, кажется, есть проблема в другом месте. При использовании вашего кода пагинация снова перестает работать - точно такое же поведение, как упоминалось в моем вопросе выше. Клик по ссылке не обновляет представление, и пагинация не работает. Если я раскомментирую ваши последние два блока if
в вашей функции (строки, касающиеся постоянных ссылок), ваша функция снова работает нормально. Так что всё работает хорошо, кроме части с перезаписью ?paged
в самом URL. Есть ещё идеи, откуда это может происходить? Ещё раз спасибо за вашу потрясающую помощь до сих пор.

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

Хотя это не решение с использованием вашего точного кода, возможно, вы можете попробовать применить эту технику пагинации вместо примера, который вы использовали из WordPress Codex.
Предполагаю, что проблема может быть связана с получением части шаблона в этой строке кода:
<?php get_template_part( 'inc/search', 'result' ); ?>
Если это не решит вашу проблему, я бы посоветовал перенести содержимое из 'inc/search' и включить его непосредственно в страницу результатов поиска, не используя <?php get_template_part(); ?>
- это может помочь выявить любые странности.
