Проблема с пагинацией WordPress в шаблоне search.php

2 янв. 2018 г., 09:32:18
Просмотры: 359
Голосов: 1

У меня небольшая проблема - пагинация не работает в файле search.php. Я делаю запрос результатов через wp_Query, используя код ниже. Ссылки на страницы отображаются, но при нажатии на них получаю ошибку 404. Мне сказали, что это происходит потому, что я делаю запрос на странице search.php.

Код, который я использую, взят из документации WordPress по пагинации. Запрос длинный, но самое важное - эти две строки:

$paged = ( get_query_var( 'paged' ) ) ? absint( get_query_var( 'paged' ) ) : 1;

и

'paged' => $paged,

Полный запрос

if (isset($_GET['reg-prop-search-form'])){
    $paged = ( get_query_var( 'paged' ) ) ? absint( get_query_var( 'paged' ) ) : 1;


    $args = array(
        'posts_per_page' => 9,
        's' => $_GET['s'],
        'post_type'      => 'property',
        'paged' => $paged,
        'meta_query'     =>  array(
            'relation '  => 'AND',
            array(
                'key'       => 'prop_area',
                'value'     => $area,
                'compare'   => $area_val,
            ),
            array(
                'key'       => 'prop_city',
                'value'     => $city,
                'compare'   => $city_val,
            ),
            array(
                'key'       => 'prop_type',
                'value'     => $type,
                'compare'   => $type_val,
            ),
            array(
                'key'     => 'prop_rooms',
                'value'   => array( $fromrooms, $torooms ),
                'type'    => 'numeric',
                'compare' => 'BETWEEN',
            ),
            array(
                'key'     => 'prop_store',
                'value'   => array( $fromfloor, $tofloor ),
                'type'    => 'numeric',
                'compare' => 'BETWEEN',
            ),
            array(
                'key'     => 'prop_price',
                'value'   => array( $min, $max ),
                'type'    => 'numeric',
                'compare' => $equal,
            ),
        ),
    );  
};

Это цикл

$the_query = new WP_Query( $args );

.....

    <?php if( $the_query->have_posts() ): ?>
        <?php while( $the_query->have_posts() ) : $the_query->the_post(); ?>


            <?php get_template_part( 'content', 'search' ); ?>

        <?php endwhile; ?>
    <div id="pagination">

        <?php

            $big = 999999999;
             echo paginate_links( array(
                'base' => str_replace( $big, '%#%', esc_url( get_pagenum_link( $big ) ) ),
                'format' => '?paged=%#%',
                'current' => max( 1, get_query_var('paged') ),
                'total' => $the_query->max_num_pages
            ) );
        ?>
        <?php echo paginate_links( $args ); ?>


    </div>
    <?php else : ?>

        <?php get_template_part( 'no-results', 'search' ); ?>

    <?php endif; ?>
    <?php wp_reset_query();  // Восстанавливаем глобальные данные записи, перезаписанные the_post(). ?>
</div>
Комментарии

Ошибка 404 возникает до того, как выбирается ваш файл шаблона. Используйте глобальный запрос и хук действия pre_get_posts для его изменения.

janh janh
2 янв. 2018 г. 09:52:01

Спасибо за ваш ответ, я прочитал документацию. Я не использую глобальный запрос, я использую wp_query. В какой функции я должен использовать упомянутый вами pre_get_post?

DavSev DavSev
2 янв. 2018 г. 10:01:07

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

janh janh
2 янв. 2018 г. 12:53:16