Как вывести посты на статичной странице с постраничной навигацией — WordPress

nelzya-prosto-tak-vzyat-i-boromir-mem_15617877_orig_

Ужас, как это тяжело оказалось… Перерыта тонна источников.

Код:

<?php
 // set up or arguments for our custom query
$paged = get_query_var( 'paged' ) ? get_query_var( 'paged' ) : 1;
$posts_per_page = 2;
$offset = ( $paged - 1 ) * $posts_per_page;
$query_args = array(
'post_type' => 'realestate',
'posts_per_page' => $posts_per_page,
'paged' => $paged,
'offset'=> $offset
);
// create a new instance of WP_Query
$wp_query = new WP_Query( $query_args );
?>

<?php if ( $wp_query ->have_posts() ) : while ( $wp_query ->have_posts() ) : $wp_query ->the_post(); // run the loop ?>
<article>
<h1><?php echo the_title(); ?></h1>
<div class="excerpt">
<?php the_excerpt(); ?>
</div>
</article>
<?php endwhile; ?>

<?php if ($wp_query ->max_num_pages > 1) { // check if the max number of pages is greater than 1 ?>
<nav class="prev-next-posts">
<div class="prev-posts-link">
<?php echo get_next_posts_link( 'Older Entries' ); // display older posts link ?>
</div>
<div class="next-posts-link">
<?php echo get_previous_posts_link( 'Newer Entries' ); // display newer posts link ?>
</div>
</nav>
<?php } ?>

<?php else: ?>
<article>
<h1>Sorry...</h1>
<p><?php _e('Sorry, no posts matched your criteria.'); ?></p>
</article>
<?php endif; ?>

 

Разбираем код:

$paged = get_query_var( 'paged' ) ? get_query_var( 'paged' ) : 1;

этот кусок отвечает за вывод или невывод пейджинации (если есть, что выводить, то условие равно 1, то есть true).

Записываем количество выводимых постов в переменную (так как используем ее дважды):

$posts_per_page = 5;

Далее загоняем аргументы в функцию вывода постов:

$query_args = array(
'post_type' => 'post',
'category__not_in' => array( 3, 1 ),
'posts_per_page' => $posts_per_page,
'paged' => $paged,
'offset'=> $offset
);

Если нужно указать категорию, то добавляем в аргументы — ‘category_name’ => ‘tutorials’ — где tutorials меняем на свою категорию. Не забываем ставить запятые после каждого следующего аргумента, кроме последнего.

Если нужно вывести все посты КРОМЕ каких-то категорий (как у меня), то вместо этой строки пишем:

'category__not_in' => array( 3, 1 )

где 3 и 1 — айдишники исключенных категорий. (Берутся из урлы открытой в админке категории).

Теперь самое главное, без этой строки страница при пэйджинации показывает одни и те же посты!!!

То есть листаем, видим в адресе изменение урлы — /page/2/, /page/3/ и так далее, а контент один и тот же — первые пять постов блога.

Итак, это значение offset:

'offset'=> $offset

Для него разработна функция, которая и делает то самое перелистывание:

$offset = ( $paged - 1 ) * $posts_per_page;

$posts_per_page — это второе использование переменной с количеством выводимых постов.