Проблема с настройкой количества постов на странице в WordPress

16 янв. 2012 г., 17:08:30
Просмотры: 18.7K
Голосов: 3

ОК, вот моя проблема. У меня есть статическая главная страница и отдельная страница постов на моем сайте WordPress. Я определил их в панели администратора. Также я установил максимальное количество отображаемых постов равным 5 (в Настройки → Чтение), но все посты (10+) все равно отображаются на странице блога.

Я также вывожу последние 3 поста на статической главной странице с помощью пользовательского запроса:

$wp_query = new WP_Query( array( 'posts_per_page' => 3 ));

<код цикла вывода результатов>

Но этот список также отображает больше 3 постов. Похоже, WordPress игнорирует ограничение posts_per_page, которое я устанавливаю как через админ-панель, так и через код. Что за чертовщина творится? Это мой первый опыт разработки сайта на WordPress. Это распространенная проблема для новичков?

РЕДАКТИРОВАНИЕ:

Я упростил код главной страницы до базового блока, который просто получает заголовки постов. Все равно возвращается больше 3 постов. Вот актуальный (и единственный) код на главной странице:

<div id="content">

  <?php $wp_query = new WP_Query( array( 'posts_per_page' => 3 ) );?>

  <?php if ( $wp_query->have_posts() ) : ?>
  <ul>
    <?php while ( $wp_query->have_posts() ) : $wp_query->the_post(); ?>
    <li>
      <a href="<?php the_permalink() ?>"><?php the_title(); ?></a>
    </li>
    <?php endwhile;?>
  </ul>
  <?php endif; ?>

</div>
2
Комментарии

Судя по предоставленному коду, вы всё сделали правильно. Не могли бы вы показать больше кода, чтобы помочь найти, где ошибка?

mor7ifer mor7ifer
16 янв. 2012 г. 17:15:35

Это не обязательно связано с вашей проблемой, но вам следует использовать другую переменную вместо $wp_query для своих кастомных запросов. Это глобальная переменная, которую WordPress использует для основного цикла, и вы можете получить непредсказуемые результаты, используя её для других целей.

Milo Milo
16 янв. 2012 г. 19:10:07
Все ответы на вопрос 4
0

Хочу добавить свой случай в этот список, потому что у меня ушло уйма времени на отладку. Проблема была в том, что я изменил количество постов на странице архива, используя хук pre_get_posts:

add_filter('pre_get_posts', 'number_of_posts_on_archive');
function number_of_posts_on_archive($query)
{
    if(is_post_type_archive(array('post_type1', 'post_type2')))
    {
        $query->set('posts_per_page', 20);
    }
    return $query;
}

А чтобы исправить проблему, когда запрос включал посты совершенно другого типа записи, я добавил в условие if следующее:

if( (is_post_type_archive(array('post_type1', 'post_type2'))) && ($query->get('post_type') !== 'post') )
{
    ....
}

Публикую это здесь, потому что данная страница была первой в результатах поиска Google по моему запросу. Возможно, это поможет кому-то, кто не может понять часами... или двумя, почему запрос просто не хочет вас слушаться.

3 сент. 2014 г. 22:52:05
1

Это может быть вызвано темой или плагином, переопределяющим настройки WordPress. Вы можете попробовать включить тему TwentyEleven или TwentyTen, а также отключить все плагины, чтобы проверить, будет ли это работать в таком случае.

Если это поможет, вы можете сообщить, какую тему используете (если это предустановленная тема) или какие плагины пришлось отключить для исправления работы - и мы посмотрим, что можно сделать для решения проблемы.

16 янв. 2012 г. 18:58:57
Комментарии

Спасибо. Отключил этот дурацкий шаблон, и всё заработало! Я скачал его с devpress.com (новостная тема). Её рекламируют как «продвинутую» родительскую тему, и пользователям запрещают что-либо «трогать». Думаю, под «продвинутой» они подразумевали плохо написанный код, ведь я всего лишь добавил код для получения записей после их модного слайд-шоу.

JCoder JCoder
16 янв. 2012 г. 20:33:46
1
// Добавьте этот код непосредственно перед вызовом вашего кода и настройте его по своему усмотрению
function hwl_home_pagesize( $query ) {
    if ( is_admin() || ! $query->is_main_query() )
        return;

    if ( is_home() ) {
        // Отображать только 1 пост для основной архивной страницы блога
        $query->set( 'posts_per_page', 1 );
        return;
    }

    if ( is_post_type_archive( 'movie' ) ) {
        // Отображать 50 записей для пользовательского типа записей 'movie'
        $query->set( 'posts_per_page', 50 );
        return;
    }
}
add_action( 'pre_get_posts', 'hwl_home_pagesize', 1 );
14 июл. 2013 г. 12:18:13
Комментарии

Пожалуйста, добавьте объяснение к вашему ответу: почему это может решить проблему?

fuxia fuxia
4 февр. 2014 г. 00:50:20
0

N.Schipper правильно указал. Но в условии не хватает ещё одного условия

! is_admin()

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

if( (! is_admin()) && (is_post_type_archive(array('post_type1', 'post_type2'))) && ($query->get('post_type') !== 'post') )
{
  {
    $query->set( 'posts_per_page', 6 );
    return;
}
}
9 дек. 2017 г. 18:07:57