paginate_links() неправильно работает в search.php?

1 сент. 2012 г., 20:54:46
Просмотры: 20.5K
Голосов: 6

Я использую это в моем 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
4
Комментарии

Покажите запрос для этого запроса.

kaiser kaiser
1 сент. 2012 г. 21:14:28

Я обновил свой вопрос с моим шаблоном search.php. Внутри search-result.php нет цикла, только чистый HTML.

mathiregister mathiregister
1 сент. 2012 г. 21:27:28

Вы просмотрели предыдущие вопросы, связанные с paginate_links()?

Chip Bennett Chip Bennett
1 сент. 2012 г. 21:33:38

Я довольно долго читал и гуглил, но, кажется, не могу найти решение. Есть идеи?

mathiregister mathiregister
1 сент. 2012 г. 21:47:34
Все ответы на вопрос 2
6
11

Я почти уверен, что это уже где-то обсуждалось, но повторю здесь снова.

Полагаю, ваша проблема заключается здесь:

'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' => '&lt;&lt;',
        'next_text' => '&gt;&gt;'
    );

    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 );
}
2 сент. 2012 г. 00:34:18
Комментарии

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

mathiregister mathiregister
2 сент. 2012 г. 09:59:33

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

Chip Bennett Chip Bennett
2 сент. 2012 г. 17:08:25

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

Chip Bennett Chip Bennett
2 сент. 2012 г. 17:16:27

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

mathiregister mathiregister
2 сент. 2012 г. 17:55:09

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

Chip Bennett Chip Bennett
3 сент. 2012 г. 21:23:14

Только что попробовал, и get_query_var('paged') сам по себе работает отлично. Нет необходимости извлекать это из глобальной переменной.

kaiser kaiser
25 сент. 2012 г. 04:55:34
Показать остальные 1 комментариев
1

Хотя это не решение с использованием вашего точного кода, возможно, вы можете попробовать применить эту технику пагинации вместо примера, который вы использовали из WordPress Codex.

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

<?php get_template_part( 'inc/search', 'result' ); ?>

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

1 сент. 2012 г. 22:36:43
Комментарии

Спасибо за ваш ответ. Это не связано с get_template_part(), потому что я также пробовал вставлять код шаблона напрямую в цикл. И техника пагинации, которую вы указали в своем комментарии, не дает разницы - эффект тот же.

mathiregister mathiregister
1 сент. 2012 г. 22:50:13