it-roy-ru.com

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
/**
 * The template for displaying Search Results pages
 */

get_header(); ?>

<?php if ( have_posts() ) : ?>
    <hgroup class="section-heading wrapper">
        <h1>Results</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>Nothing found</h2>
        </div>
<?php endif; ?>

<?php get_footer(); ?>

Правка

Используя рекомендуемый код из ответа ниже:

/**
 * Pagination links for search and archives
 */

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 - немецкое слово для страницы).

Возможно ли, чтобы постоянные ссылки работали именно так. Страница работает с вашим кодом, только постоянные ссылки выглядят так:

  • mypage.com/search/term?paged=2
6
mathiregister

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

Я считаю, что ваша проблема лежит здесь:

'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():

/**
 * Paginate Archive Index Page 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;

    // Sanitize input argument values
    if ( ! in_array( $type, array( 'plain', 'list', 'array' ) ) ) $type = 'plain';
    $endsize = absint( $endsize );
    $midsize = absint( $midsize );

    // Setup argument array for 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 );
}
8
Chip Bennett

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

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

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

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

0
Craig Pearson