Не удается настроить paginate_links с пользовательским запросом

5 апр. 2014 г., 03:52:32
Просмотры: 19.9K
Голосов: 1

Я создал раздел новостей на своем сайте WordPress с помощью плагинов Advanced Custom Fields и Custom Post Type UI. На странице обзора новостей (не стандартные записи WordPress) я хотел ограничить количество новостей до шести на странице и добавить навигацию с помощью paginate_links. Я создал следующий код:

<section class="news-main" role="main">
    <?php
        $args = array(
            'post_type' => 'news',
            'posts_per_page' => '6'
        );
        $the_query = new WP_Query( $args );
        $temp_query = $wp_query;
        $wp_query = NULL;
        $wp_query = $the_query;
        $pagination = array(
            'base' => '%_%',
            'format' => '?page=%#%',
            'total' => $the_query->max_num_pages,
            'prev_next' => True,
            'prev_text' => __( '<< Предыдущая' ),
            'next_text' => __( 'Следующая >>' )
        );
        if ( $the_query->have_posts() ) : while ( $the_query->have_posts() ) : $the_query->the_post(); ?>
        <article class="news-snippet">
            <header class="news-box">
                <h2 class="mus-hi slogan-head fancy"><span class="fancy-hook"><?php the_time( 'j. F Y' ); ?></span></h2>
                <a href="<?php the_permalink(); ?>"><p class="bran-hn slogan-state closure"><?php the_title(); ?></p></a>
            </header>
            <div class="news-wrap">
                <p class="news-excerpt"><?php echo acf_excerpt( 'news_post', 35, ' <span class="news-more-inbox">[...]</span>' ); ?></p>
                <p class="bran-hn news-more"><a href="<?php the_permalink(); ?>">Подробнее &rarr;</a></p>
            </div>
        </article>
    <?php endwhile; ?>
        <?php wp_reset_postdata(); ?>
    <?php else: ?>
        <p>Записей нет</p>
    <?php endif; ?>
    <nav>
        <?php echo paginate_links( $pagination );
                $wp_query = NULL;
                $wp_query = $temp_query; ?>
    </nav>
</section>

Сначала определяются аргументы для wp_query, затем устанавливается $the_query с WP_Query, после этого переменная $wp_query сохраняется во временную переменную, сбрасывается в NULL и затем устанавливается в переменную $the_query. На последнем этапе устанавливается массив настроек для paginate_links. Далее идет цикл для вывода новостей. После цикла вызывается функция paginate_links и, наконец, $wp_query сбрасывается и записывается обратно содержимое временной переменной $temp_query.

Если у меня есть, скажем, 15 записей блога, мой вывод выглядит следующим образом:

Макет paginate_links

Если я наведу курсор на цифру три, конец URL выглядит следующим образом:

URL для страницы 3

Проблема в том, что ссылки "предыдущая" и "следующая" не отображаются, хотя они установлены. Основная проблема в получаемом URL - если я нажму на цифру три, я попаду на страницу 404. "page 3" неизвестен для WordPress.

Обновление:

$args = array(
    'post_type' => 'news',
    'posts_per_page' => '1'
);  
$the_query = new WP_Query( $args );
$temp_query = $wp_query;
$wp_query = NULL;
$wp_query = $the_query;
$total_pages = $wp_query->max_num_pages;
if ( $total_pages > 1) {
    $paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
    $current_page = new WP_Query('post_type=news&posts_per_page=1&paged=' . $paged);
    $pagination = array(
        'base' => '%_%',
        'format' => '?paged=%#%',
        'mid-size' => 1,
        'current' => $current_page,
        'total' => $total_pages,
        'prev_next' => True,
        'prev_text' => __( '<< Предыдущая' ),
        'next_text' => __( 'Следующая >>' )
    );
}

Обновление 2:

Хорошо, со следующими изменениями в первой части кода навигация заработала

$args = array(
    'post_type' => 'news',
    'posts_per_page' => '3',
    'paged' => get_query_var( 'paged' )
);  
$the_query = new WP_Query( $args );
$temp_query = $wp_query;
$wp_query = NULL;
$wp_query = $the_query;
$total_pages = $wp_query->max_num_pages;
if ( $total_pages > 1) {
    $the_paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
    $pagination = array(
        'base' => @add_query_arg('paged','%#%'),
        'format' => '?paged=%#%',
        'mid-size' => 1,
        'current' => $the_paged,
        'total' => $total_pages,
        'prev_next' => True,
        'prev_text' => __( '<< Предыдущая' ),
        'next_text' => __( 'Следующая >>' )
    );
}

Остался только один вопрос (единственное, что все еще работает неправильно): возможно ли, чтобы первая ссылка была link вместо link/?paged=1

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

Почему вы используете тег h2 для элемента с датой?

ahmetlutfu ahmetlutfu
6 апр. 2014 г. 01:46:58
Все ответы на вопрос 1
5

Что касается количества отображаемых страниц, ознакомьтесь с аргументами для paginate_links, в частности end_size и mid_size.

Что касается ошибки 404 - проблема в том, что страницы 3 не существует. Возвращает ли страница контент или загружает шаблон 404, зависит от результатов основного запроса, а не вашего пользовательского запроса в шаблоне. Если это тип записи page, попробуйте установить переменную запроса paged вместо page.

5 апр. 2014 г. 06:36:29
Комментарии

Спасибо, нумерация теперь работает нормально, потребовалось немного доработки в настройках, а также для ссылок "предыдущая" и "следующая". В целом пагинация выглядит хорошо, но пока не функционирует. Когда я нажимаю на цифру 2, перехожу на ?paged=2 и больше не получаю шаблон 404. Однако по-прежнему отображаются записи с первой страницы, а единица остается с классом current вместо того, чтобы переключиться на страницу 2. Также не отображается ссылка "Предыдущая".

rkoller rkoller
6 апр. 2014 г. 01:29:36

Насчет твоего предположения, что всё опирается на основной запрос вместо моего кастомного - я думал, что с помощью $wp_query = $the_query; я "перенес" свой кастомный запрос в основной и сделал его доступным для функции paginate_links.

rkoller rkoller
6 апр. 2014 г. 01:31:18

Я добавил обновление в исходный пост с обновленным фрагментом кода для PHP-частей, связанных с paginate_links (пытался включить paged - но всё еще не работает :/ ).

rkoller rkoller
6 апр. 2014 г. 01:33:44

возвращается 404 или нет, определяется до загрузки вашего шаблона, этот код никогда не выполняется, если переменные запроса не корректны. И вы видите первые 6 записей на каждой странице, потому что вы не установили paged в аргументах вашего пользовательского запроса.

Milo Milo
6 апр. 2014 г. 01:33:56

Ааааааааааа, я понял. Я немного тупил - использовать paged уже в пользовательском запросе я не понял и не осознал, но теперь все встало на свои места. Глупый я :( Хорошо, отображение статей теперь работает идеально. Осталось только исправить, чтобы навигация paginate_links отражала изменения. Но мне придется поиграться и попробовать завтра утром. Уже поздно. Спасибо!

rkoller rkoller
6 апр. 2014 г. 01:55:11