Как использовать the_posts_navigation с wp_query и get_posts?

15 янв. 2015 г., 04:09:12
Просмотры: 49.1K
Голосов: 9

WordPress имеет функцию the_posts_navigation начиная с версии 4.1.0. Но я не знаю, как использовать её с wp_query или get_posts. Следующий код находится в файле шаблона страницы.
Метод wp_query:

    <?php
    if ( get_query_var('paged') ) {
    $paged = get_query_var('paged');
    } else if ( get_query_var('page') ) {
    $paged = get_query_var('page');
    } else {
    $paged = 1;
    }

    $get_posts=new wp_query('post_type=case&posts_per_page=2&paged='.$paged);

    while($get_posts->have_posts()):$get_posts->the_post();
    the_title();
    endwhile;

    the_posts_pagination( array(
        'prev_text'          => __( 'Предыдущая страница', 'cm' ),
        'next_text'          => __( 'Следующая страница', 'cm' ),
        'before_page_number' => '<span class="meta-nav screen-reader-text">' . __( 'Страница', 'cm' ) . ' </span>',
    ) );
    ?>

Метод get_posts:

    <?
    while(have_posts()):the_post();
    if ( get_query_var('paged') ) {
        $paged = get_query_var('paged');
        } else if ( get_query_var('page') ) {
        $paged = get_query_var('page');
        } else {
        $paged = 1;
    }

    $case_posts=get_posts('post_type=case&posts_per_page=2&paged='.$paged);
    echo '<pre>';
    print_r($case_posts);
    echo '</pre>';
    foreach($case_posts as $case_post){
        echo $case_post->post_title;
    }
    endwhile;
    // Навигация по предыдущей/следующей странице
    the_posts_pagination( array(
        'prev_text'          => __( 'Предыдущая страница', 'cm' ),
        'next_text'          => __( 'Следующая страница', 'cm' ),
        'before_page_number' => '<span class="meta-nav screen-reader-text">' . __( 'Страница', 'cm' ) . ' </span>',
    ) );
    ?>

Они не работают и не отображают пагинацию, но при ручном вводе http://127.0.0.1/gdboer/?page_id=74&page=2 в адресной строке это работает. Кто может помочь, большое спасибо!

1
Комментарии

Ваш вопрос вводит в заблуждение, так как в вашем коде используется the_posts_pagination, что отличается от вопроса в заголовке the_posts_navigation.

Jevuska Jevuska
2 апр. 2016 г. 23:02:12
Все ответы на вопрос 3
4
10

the_posts_navigation() — это просто функция-обертка для get_the_posts_navigation(), которая, в свою очередь, является оберткой для paginate_links. Первые две функции используют те же самые параметры, что и paginate_links, и фактически передают их в последнюю функцию.

get_the_posts_navigation() и the_posts_navigation() — это хорошие новые функции, так как они устраняют необходимость в большом количестве пользовательского кода и более удобны для начинающих пользователей, которые хотят иметь нумерованные ссылки пагинации.

Единственный недостаток get_the_posts_navigation() заключается в том, что разработчики обернули функцию paginate_links в условное выражение, которое гласит: если главный запрос ($wp_query) содержит менее 1 страницы (помните, что первая страница — это 0, а вторая — 2), не показывать ссылки. Это проблематично для пользовательских запросов на шаблонах страниц. Страницы всегда имеют только одну страницу, поэтому эти функции не работают с пользовательскими запросами.

Единственное реальное решение, если вам нужно использовать the_posts_navigation(), — это воспользоваться ответом @ChipBennet в этой публикации. Мне не нравится идея обнуления главного запроса (довольно костыльное решение, на мой взгляд, это похоже на использование query_posts), но я не вижу другого способа заставить get_the_posts_navigation() работать с пользовательскими запросами.

15 янв. 2015 г. 12:24:08
Комментарии

Спасибо за ваш ответ. Теперь я знаю, что функция не работает с пользовательскими запросами. Кстати, вам не нравится аннулирование основного запроса. Но какой метод вы использовали?

Vincent Wong Vincent Wong
16 янв. 2015 г. 02:31:23

Я не использую нативную функцию, я написал свою собственную функцию пагинации, которую применяю. Вы можете посмотреть её здесь

Pieter Goosen Pieter Goosen
16 янв. 2015 г. 06:14:04

Если я использую постоянную ссылку вида http://127.0.0.1/gdboer/?post_type=case, она не работает. А ссылка http://127.0.0.1/gdboer/?page_id=74 работает корректно.

Vincent Wong Vincent Wong
17 янв. 2015 г. 04:14:35

Я поэкспериментирую с этим на следующей неделе. Сейчас занят другими делами. Большое спасибо за ваш ответ. Это действительно очень мне помогло.

Pieter Goosen Pieter Goosen
17 янв. 2015 г. 08:24:16
2

У меня есть пользовательский шаблон, и я потратил(а) часы, пытаясь отобразить компонент пагинации. Вот что сработало для меня.

$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
$args = array(
    'posts_per_page' => 3,
    'orderby' => 'menu_order',
    'order'=> 'ASC',
    'paged'=>$paged,
    'post_type' => 'projects'
    );

$projects = new WP_Query($args);

            <!-- рабочий пример пагинации с номерами -->
            ...<?php endwhile;?>
                <?php 
                $GLOBALS['wp_query']->max_num_pages = $projects->max_num_pages;
                the_posts_pagination( array(
                   'mid_size' => 1,
                   'prev_text' => __( 'Назад', 'green' ),
                   'next_text' => __( 'Вперед', 'green' ),
                   'screen_reader_text' => __( 'Навигация по записям' )
                ) ); ?>
             ИЛИ
             <!-- рабочий пример пагинации без номеров -->
             ...<?php endwhile;?>   
             <?php next_posts_link( 'следующая', $projects->max_num_pages ); ?>
             <?php previous_posts_link('предыдущая') ?>
25 апр. 2015 г. 03:56:41
Комментарии

Определенно интересная идея, но единственное, что мне не очень нравится — это изменение основного объекта запроса. Это своего рода хак, который может преследовать вас кошмарами, потому что вы не сбрасываете основной запрос после завершения работы. Просто имейте это в виду. Вот почему глобализация — такая опасная штука, любой может изменить значения. Помните, многие плагины зависят от глобальных переменных, особенно $wp_query и $post.

Pieter Goosen Pieter Goosen
25 апр. 2015 г. 08:33:26

Большое спасибо. $GLOBALS['wp_query']->max_num_pages — это именно тот кусочек, которого мне не хватало. Не уверен, что есть более правильный способ.

Space Space
11 авг. 2017 г. 02:17:42
2

Эта функция использует get_the_posts_pagination(), которая использует GLOBAL wp_query для настройки функции paginate_links(), поэтому я считаю, что она не будет работать с get_posts.

Попробуйте использовать функцию paginate_links() напрямую или функцию posts_nav_link().

Примечание: Убедитесь, что вы используете wp_reset_query()

15 янв. 2015 г. 04:31:57
Комментарии

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

Vincent Wong Vincent Wong
15 янв. 2015 г. 10:16:08

мне не удалось заставить get_the_posts_pagination() работать в моем ajax-запросе, но paginate_links() работает отлично. спасибо за это.

honk31 honk31
14 янв. 2020 г. 15:25:32