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

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

Я создал страницу архива для моего пользовательского типа записи reference, где я использую запрос, чтобы получить все записи типа reference. Это работает, но когда я пытаюсь сделать пагинацию результатов, это не работает. На данный момент она даже не выводит ссылки на пагинацию.

ИЗМЕНЕНИЕ: Ранее это использовалось на обычной странице, но я изменил это на страницу архива. В этот момент пагинация перестала работать.

Вот исходный код;

Пользовательский тип записи reference (плагин)

<?php
   /*
   комментарии здесь удалены 
   */
?>
<?php

/* Пользовательские типы записей */
function create_references_post_type() {
    $labels = array(
        'name'               => __( 'Ссылки', 'kasparabi' ),
        'singular_name'      => __( 'Ссылка', 'kasparabi' ),
        'add_new'            => __( 'Добавить новую', 'kasparabi' ),
        'add_new_item'       => __( 'Добавить новую ссылку', 'kasparabi' ),
        'edit_item'          => __( 'Редактировать ссылку', 'kasparabi' ),
        'new_item'           => __( 'Новая ссылка', 'kasparabi' ),
        'all_items'          => __( 'Все ссылки', 'kasparabi' ),
        'view_item'          => __( 'Просмотреть ссылку', 'kasparabi' ),
        'search_items'       => __( 'Поиск ссылок', 'kasparabi' ),
        'not_found'          => __( 'Ссылки не найдены', 'kasparabi' ),
        'not_found_in_trash' => __( 'В Корзине ссылки не найдены', 'kasparabi' ), 
        'parent_item_colon'  => '',
        'menu_name'          => __('Ссылки', 'kasparabi')
    );
    $args = array(
        'labels'        => $labels,
        'description'   => __('Все ссылки', 'kasparabi'),
        'public'        => true,
        'menu_position' => 5,
        'supports'      => array( 'title', 'editor', 'thumbnail', 'excerpt'),
        'has_archive'   => __('links', 'kasparabi')/*,
        'rewrite'       => array('slug' => __('links', 'kasparabi'))*/
    );
    register_post_type( 'reference', $args );   
}
add_action('init', 'create_references_post_type');

function add_post_type_to_query( $query ) {
    if ( is_home() && $query->is_main_query() )
        $query->set( 'post_type', array( 'reference' ) );
    return $query;
}
add_action( 'pre_get_posts', 'add_post_type_to_query' );

?>

Способ, которым я запросил записи:

$wp_query = new WP_Query(array(
                        'post_type' => 'reference', 
                        'posts_per_page' => 9,
                        'paged' => (get_query_var('paged')) ? get_query_var('paged') : 1 
                    ));

Как я вывожу ссылки на пагинацию:

<div class="col-xs-12">
    <?php previous_posts_link(__('&larr; новее', 'kasparabi')); ?>

    <?php if ($loop->max_num_pages > $paged) :
        next_posts_link(__('старше &rarr;', 'kasparabi'), $posts_per_page);
    endif; ?>
</div>

И как бонусный вопрос; есть ли другой способ получить записи, кроме создания нового запроса каждый раз?

Не должно ли это выглядеть так?

'paged' => (get_query_var('paged')) ? get_query_var('paged') : 1

А next_posts_link / previous_posts_links имеет следующие аргументы:

 next_posts_link( $label , $max_pages );

$label не является строкой в вашем коде, а скорее массивом?

Я не очень знаком с этими “магическими функциями PHP”, но что вы предполагаете, что эти “__” делают? Насколько я проинформирован, это не следует использовать.

Вы регистрируете свой тип записи с именем reference, в этом случае вы можете использовать встроенную иерархию шаблонов, чтобы получить правильный цикл. Создайте файл в корне вашей темы с именем archive-reference.php.

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

<?php if ( ! have_posts() ) : ?>
  <div class="alert alert-warning">
    <?php _e( 'Извините, результатов не найдено.', 'kasparabi' ); ?>
  </div>
<?php endif; ?>

<?php while ( have_posts() ) : the_post(); ?>
  <article <?php post_class(); ?>>
    <h3><?php the_title(); ?></h3>

    <div class="entry-summary"><?php the_excerpt(); ?></div>

    <a href="https://wordpress.stackexchange.com/questions/126750/<?php the_permalink(); ?>"><?php _e('Читать далее', 'kasparabi'); ?></a>
  </article>
<?php endwhile; ?>

<?php if ($wp_query->max_num_pages > 1) : ?>
  <nav class="post-nav">
    <ul class="pager">
      <li class="previous"><?php next_posts_link(__('Старше', 'kasparabi')); ?></li>
      <li class="next"><?php previous_posts_link(__('Новая', 'kasparabi')); ?></li>
    </ul>
  </nav>
<?php endif; ?>

Это будет перечислять ваши ссылки с их заголовком и отрывком.

Не забудьте разрешить перезапись в вашей декларации типа записи:

  $rewrite = array(
    'slug'                  => 'references',
    'with_front'            => false,
    'pages'                 => true,
    'feeds'                 => true,
  );

  ...

  'rewrite' => $rewrite,

Если вы хотите запросить ваши ссылки на странице, вам всегда нужно создавать пользовательский запрос. Этот ответ может помочь вам, как это сделать: https://stackoverflow.com/a/20905538/2043492

Надеюсь, это поможет!

<?php 

/*это ваш запрос*/
global $wp_query;
$wp_query = new WP_Query(array(
    'post_type' => 'reference', 
    'posts_per_page' => 9,
    'paged' => (get_query_var('paged')) ? get_query_var('paged') : 1 
));

/*код пагинации здесь с обновлением максимальных страниц*/            

$GLOBALS['wp_query']->max_num_pages = $wp_query->max_num_pages;
the_posts_pagination(array(
    'mid_size' => 1,
    'prev_text' => __('Предыдущая страница', 'patelextensions'),
    'next_text' => __('Следующая страница', 'patelextensions'),
    'before_page_number' => '<span class="meta-nav screen-reader-text">' . __('Страница', 'patelextensions') . ' </span>',
));

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

Для настройки пагинации на странице архива вашего пользовательского типа записей reference, необходимо учесть несколько моментов. Давайте разберемся с текущим кодом и внесем необходимые изменения для правильной работы пагинации.

Шаг 1: Создание файла архива

Первым делом, вы должны создать файл archive-reference.php в корневой папке вашей темы. В этом файле WordPress автоматически обрабатывает запросы к типу записи reference и вы сможете вывести карточки записей и пагинацию без необходимости создавать новый WP_Query.

Примерный код для вашего archive-reference.php:

<?php get_header(); ?>

<div class="container">
    <?php if ( ! have_posts() ) : ?>
        <div class="alert alert-warning">
            <?php _e( 'Извините, результаты не найдены.', 'kasparabi' ); ?>
        </div>
    <?php else : ?>
        <?php while ( have_posts() ) : the_post(); ?>
            <article <?php post_class(); ?>>
                <h3><?php the_title(); ?></h3>
                <div class="entry-summary"><?php the_excerpt(); ?></div>
                <a href="<?php the_permalink(); ?>"><?php _e('Читать далее', 'kasparabi'); ?></a>
            </article>
        <?php endwhile; ?>

        <?php
        // Пагинация
        the_posts_pagination(array(
            'mid_size' => 2,
            'prev_text' => __('Предыдущая', 'kasparabi'),
            'next_text' => __('Следующая', 'kasparabi'),
        ));
        ?>
    <?php endif; ?>
</div>

<?php get_footer(); ?>

Шаг 2: Настройки пользовательского типа записей

Убедитесь, что при регистрации вашего пользовательского типа записей вы подключили rewrite, чтобы правильным образом обрабатывать URL. Вот пример кода, который вы можете использовать:

function create_references_post_type() {
    $labels = array(
        // ваши метки
    );

    $args = array(
        'labels'        => $labels,
        'public'        => true,
        'has_archive'   => true,
        'rewrite'       => array('slug' => 'references'),
        'supports'      => array('title', 'editor', 'thumbnail', 'excerpt'),
    );

    register_post_type('reference', $args);   
}
add_action('init', 'create_references_post_type');

Шаг 3: Пагинация

Если вы всё же хотите использовать WP_Query, как в вашем примере, убедитесь, что вы обновляете глобальные параметры пагинации:

global $wp_query;
$wp_query = new WP_Query(array(
    'post_type'      => 'reference', 
    'posts_per_page' => 9,
    'paged'          => get_query_var('paged') ? get_query_var('paged') : 1,
));

// Вывод записей
while ($wp_query->have_posts()) : $wp_query->the_post();
    // Ваши выводы здесь
endwhile;

// Пагинация
the_posts_pagination(array(
    'mid_size' => 2,
    'prev_text' => __('Предыдущая', 'kasparabi'),
    'next_text' => __('Следующая', 'kasparabi'),
));

// Сбрасываем глобальные параметры
wp_reset_postdata();

Дополнительная информация

Отвечая на ваш дополнительный вопрос, в случае с использованием стандартной страницы архива, вам не нужно создавать новый запрос каждый раз, так как WordPress уже обрабатывает запросы к вашему пользовательскому типу записей. В этом случае вы можете воспользоваться встроенным циклом have_posts(), что более эффективно.

Также обратите внимание, что функция __() используется для интернационализации строковых меток, что следует делать для поддержки многоязычных сайтов.

Таким образом, следуя данным шагам, вы сможете правильно настроить архив для вашего пользовательского типа записей reference с пагинацией.

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

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