Вопрос или проблема
Я создал запрос для своего собственного типа записи “вебсайты”. Я пытаюсь сделать так, чтобы страница переключалась, но у меня возникают некоторые ошибки. Я думаю, что весь код в порядке, только часть прямо перед закрывающими тегами 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();
?>
Объяснение внесённых изменений:
-
Параметр ‘paged’:
Теперь параметрpaged
добавляется непосредственно в массив аргументов$args
. Это позволяет WP_Query правильно выбирать текущую страницу при выполнении запроса. -
Использование
paginate_links()
:
Вместо использованияprevious_posts_link()
иnext_posts_link()
, я добавил более гибкий метод для пагинации с помощьюpaginate_links()
. Это позволит вам контролировать внешний вид пагинации, а также гарантирует, что ссылки будут работать корректно. - Восстановление оригинального запроса:
Сброс данных после выполненияWP_Query
осуществляется с помощьюwp_reset_postdata()
. Вы можете удалить блок с$temp_query
, так как он не нужен в данном случае.
Примечания:
- Убедитесь, что ваш код находится в правильном файле шаблона, например, в
archive-website.php
, если вы используете таковой. - Также убедитесь, что при регистрации пользовательского поста (‘website’) установлен параметр
'has_archive' => true
, если хотите также поддерживать архивы.
Если вы хотите использовать ajax-пагинацию, это потребует дополнительных настроек, включая обработку AJAX-запросов и создание соответствующего JavaScript-кода. Если вам нужна помощь с этим, дайте знать!