Изменение количества записей на странице
В настройках wordpress Настройки => Чтение => На страницах блога отображать не более [поле ввода] записей
Сейчас у меня установлено 3 записи на странице.
На моей главной странице, архивах по датам, архивах меток, архивах категорий, результатах поиска и других страницах, использующих цикл и пагинацию, отображается по 3 записи на странице.
Моя цель - иметь возможность устанавливать разное количество результатов для разных страниц. Например, на главной странице показывать 3 записи, а в результатах поиска или архивах - другое количество записей на странице.
Есть идеи, как это реализовать?
Это можно сделать так: (добавьте в 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;
}

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

Потрясающе, друг! Большое спасибо за отличную статью. Я даже не знал об этих методах и раньше пробирался через объект/массив, чтобы изменить/установить значения. Отлично подходит для быстрых хаков! +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 постов на страницу для архивов
}
// И так далее...
}

Использование $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;
}
