Почему не работает аргумент numberposts в get_posts?

У меня есть главная категория "Цены", в ней 6 подкатегорий. На странице "Цены" должны выводится все подкатегории и их записи, без пагинации. Этот код выводит все как нужно. Но дополнительно создаются одинаковые страницы вида "price/page/2", "price/page/3".
Почему-то не срабатывает numberposts или posts_per_page. Вместо него берется значение из админки "На страницах блога отображать не более N записей".
<?php
			$cat           = get_category( get_query_var( 'cat' ) );
			$cat_id        = $cat->term_id;
			$parent_cat_id = $cat->parent;
			if ( $cat_id == get_opt( 'price_cat_id' ) ) { // IF IS PRICE CATEGORY
				?>
				<div class="content">
					<?php echo category_description(); ?>
				</div>
				<?php
				if ( $cat_id == get_opt( 'price_cat_id' ) ) {
					$sub_categories = get_categories( "child_of=$cat_id" );
					?>

					<?php foreach ( $sub_categories as $sub_cat ) { ?>
						<div class="table-wrapper price-table">
							<table>
								<tbody>
								<a href="<?php echo get_category_link( $sub_cat->cat_ID ); ?>"
								   class="table-header"><?php echo $sub_cat->name; ?></a>
								<?php $posts = get_posts( array(
									'numberposts'    => 30,
									'posts_per_page' => 20,
									'category'       => $sub_cat->cat_ID,
									'post_status'    => 'publish'
								) );

								foreach ( $posts as $post ) {
									setup_postdata( $post ); ?>
									<tr class="table-row">
										<td><a href="<?php the_permalink(); ?>"><?php echo $post->post_title; ?></a>
										</td>
										<td>
											<div class="price-cell"><?php echo get_field( 'price' ) . ' р.'; ?></div>
										</td>
									</tr>

								<?php } ?>
								</tbody>
							</table>
						</div>
					<? }
					wp_reset_postdata();
					pagination(); ?>

				<?php }
  • Вопрос задан
  • 764 просмотра
Решения вопроса 1
HeadOnFire
@HeadOnFire
PHP, Laravel & WordPress Evangelist
Ваш код выводит записи отдельными (от основного) запросами, а пагинация для архива категории "Цены" строится на основном запросе (глобальный $wp_query). Поскольку основной запрос вы не меняли, то и пагинация у вас присутствует, что вполне естественно и правильно.

Если вам нужно на странице "Цены" (которая является архивом рубрики "Цены") вывести ВСЕ записи из этой рубрики, сгруппировав их по подкатегориям, то:
  1. Хукаетесь в экшн pre_get_posts (дока 1 и 2)
  2. Проверяете, чтобы это был главный запрос && в рубрике "Цены"
  3. Устанавливаете нужный параметр запроса: все посты, без пагинации (nopaging = true)

Таким образом, вы получите ВСЕ посты рубрики "Цены" в главном запросе, без пагинации. Выводить стандартным циклом. Беда только в том, что они никак не сгруппированы по дочерним категориям. Решается проверками в цикле.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы