Вопрос или проблема
Я создал страницу архива для моего пользовательского типа записи 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(__('← новее', 'kasparabi')); ?>
<?php if ($loop->max_num_pages > $paged) :
next_posts_link(__('старше →', '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
с пагинацией.