Пагинация в шаблоне страницы пользовательского типа записи

Вопрос или проблема

Я создал запрос для своего собственного типа записи “вебсайты”. Я пытаюсь сделать так, чтобы страница переключалась, но у меня возникают некоторые ошибки. Я думаю, что весь код в порядке, только часть прямо перед закрывающими тегами while. Я просто не знаю, как правильно это сделать. Любая помощь будет невероятно оценена!

<?php

        // Аргументы WP_Query
        $args = array (
            'post_type'              => 'website',
            'post_status'            => 'publish',
            'pagination'             => true,
            'posts_per_page'         => '5',
            'posts_per_archive_page' => '5',
            'ignore_sticky_posts'    => false,
            'order'                  => 'DESC',
        );


        // Получение текущей страницы и добавление в массив параметров пользовательского запроса
        $mfs_query['paged'] = get_query_var( 'paged' ) ? get_query_var( 'paged' ) : 1;

        // Запрос
        $mfs_query = new WP_Query( $args );

        // Исправление пагинации
        $temp_query = $wp_query;
        $wp_query   = NULL;
        $wp_query   = $mfs_query;

        // Цикл
        if ( $mfs_query->have_posts() ) {
            while ( $mfs_query->have_posts() ) {
                $mfs_query->the_post();
                // сделать что-то

                ?> <div class="submission">

                    <a class="submission-thumb" href="https://wordpress.stackexchange.com/questions/180430/<?php echo get_permalink(get_the_ID()); ?>">
                        <?php echo the_post_thumbnail(); ?>
                    </a>

                    <a class="submission-title" href="https://wordpress.stackexchange.com/questions/180430/<?php echo get_permalink(get_the_ID()); ?>">
                        <h3><?php the_title(); ?></h3> <span class="posted-ago"><?php echo human_time_diff( get_the_time('U'), current_time('timestamp') ) . ' назад'; ?></span>
                    </a>

                    <a class="submission-link" href="<?php the_field('site_url'); ?>" target="_blank">Перейти</a>

                </div>

                <?php } ?>  
                <?php endwhile; else : ?> 

            <?php wp_reset_postdata(); ?>

            <p><?php _e( 'Извините, ни одной записи не найдено.' ); ?></p>

            <?php // Пагинация пользовательского цикла запросов
            previous_posts_link( 'Старее записи' );
            next_posts_link( 'Новые записи', $mfs_query->max_num_pages ); ?>


            <?php $wp_query = null; $wp_query = $temp_query;?>

            ?>

Просто убедитесь, что код, который вы написали в файле archive-{post_type}.php, или вы можете использовать AJAX пагинацию.

Если вам нужно использовать шаблон страницы: добавьте 'has_archive' => 'шаблон страницы' при регистрации пользовательского типа записи.

Ответ или решение

Конечно, давайте разберём вашу проблему с пагинацией на странице шаблона для пользовательского типа записи "websites". У вас уже есть хорошая основа кода, но есть несколько моментов, которые нужно исправить, чтобы пагинация работала должным образом.

Вот исправленный и доработанный код:

<?php
// WP_Query arguments
$args = array (
    'post_type'              => 'website',
    'post_status'            => 'publish',
    'posts_per_page'         => 5,
    'paged'                  => get_query_var('paged') ? get_query_var('paged') : 1, // Размещение параметра пагинации здесь
    'ignore_sticky_posts'    => false,
    'order'                  => 'DESC',
);

// The Query
$mfs_query = new WP_Query($args);

// The Loop
if ($mfs_query->have_posts()) {
    while ($mfs_query->have_posts()) {
        $mfs_query->the_post();
        // Ваш код для отображения постов

        ?>
        <div class="submission">
            <a class="submission-thumb" href="<?php echo get_permalink(get_the_ID()); ?>">
                <?php echo get_the_post_thumbnail(); ?>
            </a>

            <a class="submission-title" href="<?php echo get_permalink(get_the_ID()); ?>">
                <h3><?php the_title(); ?></h3> 
                <span class="posted-ago"><?php echo human_time_diff(get_the_time('U'), current_time('timestamp')) . ' назад'; ?></span>
            </a>

            <a class="submission-link" href="<?php the_field('site_url'); ?>" target="_blank">Посетить</a>
        </div>
        <?php 
    }

    // Pagination
    $big = 999999999; // Уникальное число для замены
    $pagination_args = array(
        'base' => str_replace($big, '%#%', esc_url(get_pagenum_link($big))),
        'format' => '?paged=%#%',
        'current' => max(1, get_query_var('paged')),
        'total' => $mfs_query->max_num_pages,
        'prev_text' => 'Предыдущие',
        'next_text' => 'Следующие',
    );

    echo paginate_links($pagination_args);

} else {
    // Если записи не найдены
    echo '<p>' . __('Извините, подходящих записей не найдено.') . '</p>';
}

// Сброс данных и восстановление оригинального запроса
wp_reset_postdata();
?>

Объяснение внесённых изменений:

  1. Параметр ‘paged’:
    Теперь параметр paged добавляется непосредственно в массив аргументов $args. Это позволяет WP_Query правильно выбирать текущую страницу при выполнении запроса.

  2. Использование paginate_links():
    Вместо использования previous_posts_link() и next_posts_link(), я добавил более гибкий метод для пагинации с помощью paginate_links(). Это позволит вам контролировать внешний вид пагинации, а также гарантирует, что ссылки будут работать корректно.

  3. Восстановление оригинального запроса:
    Сброс данных после выполнения WP_Query осуществляется с помощью wp_reset_postdata(). Вы можете удалить блок с $temp_query, так как он не нужен в данном случае.

Примечания:

  • Убедитесь, что ваш код находится в правильном файле шаблона, например, в archive-website.php, если вы используете таковой.
  • Также убедитесь, что при регистрации пользовательского поста (‘website’) установлен параметр 'has_archive' => true, если хотите также поддерживать архивы.

Если вы хотите использовать ajax-пагинацию, это потребует дополнительных настроек, включая обработку AJAX-запросов и создание соответствующего JavaScript-кода. Если вам нужна помощь с этим, дайте знать!

Оцените материал
Добавить комментарий

Капча загружается...