Изменение количества записей на странице

11 окт. 2011 г., 05:13:34
Просмотры: 43.8K
Голосов: 20

В настройках wordpress Настройки => Чтение => На страницах блога отображать не более [поле ввода] записей

Сейчас у меня установлено 3 записи на странице.

На моей главной странице, архивах по датам, архивах меток, архивах категорий, результатах поиска и других страницах, использующих цикл и пагинацию, отображается по 3 записи на странице.

Моя цель - иметь возможность устанавливать разное количество результатов для разных страниц. Например, на главной странице показывать 3 записи, а в результатах поиска или архивах - другое количество записей на странице.

Есть идеи, как это реализовать?

0
Все ответы на вопрос 3
4
30

Это можно сделать так: (добавьте в functions.php вашей темы)

add_action( 'pre_get_posts', 'set_posts_per_page' );
function set_posts_per_page( $query ) {

  global $wp_the_query;

  if ( ( ! is_admin() ) && ( $query === $wp_the_query ) && ( $query->is_search() ) ) {
    $query->set( 'posts_per_page', 3 );
  }
  elseif ( ( ! is_admin() ) && ( $query === $wp_the_query ) && ( $query->is_archive() ) ) {
    $query->set( 'posts_per_page', 5 );
  }
  // И так далее...

  return $query;
}
11 окт. 2011 г. 06:19:40
Комментарии

Является ли set методом $query?

Rutwick Gangurde Rutwick Gangurde
11 окт. 2011 г. 07:34:46

@RutwickGangurde Да. На самом деле, is_search() и is_archive() тоже, что стало немного понятнее после обновления моего ответа с информацией, почерпнутой из этой замечательной статьи: http://www.billerickson.net/customize-the-wordpress-query/ В той статье также упоминается, что в WP3.3 у нас будет метод $wp_query->is_main_query(), что довольно круто.

Dave Romsey Dave Romsey
11 окт. 2011 г. 08:10:57

Потрясающе, друг! Большое спасибо за отличную статью. Я даже не знал об этих методах и раньше пробирался через объект/массив, чтобы изменить/установить значения. Отлично подходит для быстрых хаков! +1 тебе!

Rutwick Gangurde Rutwick Gangurde
11 окт. 2011 г. 08:20:54

С какого момента стало необходимо никогда не изменять это, если это админ-панель? Похоже, что не синхронизируется "Количество элементов на странице:" в настройках экрана в WP, что может привести к страницам, на которые нельзя перейти.

NoBugs NoBugs
19 янв. 2016 г. 01:03:55
1

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

add_action( 'pre_get_posts',  'set_posts_per_page'  );
function set_posts_per_page( $query ) {

  if ( ( ! is_admin() ) && ( $query === $wp_the_query ) && ( $query->is_search() ) ) {
    $query->set( 'posts_per_page', 3 ); // Устанавливаем 3 поста на страницу для поиска
  }
  elseif ( ( ! is_admin() ) && ( $query === $wp_the_query ) && ( $query->is_archive() ) ) {
    $query->set( 'posts_per_page', 5 ); // Устанавливаем 5 постов на страницу для архивов
  }
  // И так далее...

}
10 окт. 2018 г. 13:01:44
Комментарии

В вашем коде также есть проблема, так как использование глобальной переменной $wp_query приведет к нерациональному использованию памяти, но вы не можете вызывать неопределенную переменную $wp_the_query

Abdulkabir Ojulari Abdulkabir Ojulari
16 сент. 2019 г. 23:28:19
0

Использование $GLOBALS['wp_query'] или просто $wp_query

add_action( 'pre_get_posts',  'set_posts_per_page'  );
function set_posts_per_page( $query ) {

  if ( ( ! is_admin() ) && ( $query === $GLOBALS['wp_query'] ) && ( $query->is_search() ) ) {
    // Устанавливаем 3 поста на страницу для поиска
    $query->set( 'posts_per_page', 3 );
  }
  elseif ( ( ! is_admin() ) && ( $query === $GLOBALS['wp_the_query'] ) && ( $query->is_archive() ) ) {
    // Устанавливаем 5 постов на страницу для архивов
    $query->set( 'posts_per_page', 5 );
  }

  return $query;
}
16 сент. 2019 г. 23:29:20