Показывать разное количество записей на странице в зависимости от контекста (главная, поиск, архив)
В настройках чтения есть возможность установить количество отображаемых записей, которое влияет на все разделы сайта. Мне же нужно показывать определенное количество записей на главной странице и другое количество на таких страницах, как архив, результаты поиска и т.д.
Я понимаю, что это можно сделать, редактируя файлы темы и изменяя параметры запроса, но предпочел бы более простой доступ через страницу настроек. Раньше я встречал плагин, который это делал, но сейчас не могу его найти.
Кто-нибудь знает подходящий плагин для этой задачи или, возможно, функцию для файла functions.php, которая позволит реализовать это?
Я считаю, что лучший способ реализовать это в плагине — запустить следующую примерную функцию при срабатывании хука pre_get_posts
. Объект $wp_query
доступен, что означает, что условные теги также доступны, но до того, как WordPress получит записи. Это позволяет изменять параметры запроса перед его первым выполнением, вместо добавления второго запроса, как в случае использования query_posts() в файле темы.
function custom_posts_per_page($query) {
if (is_home()) {
$query->set('posts_per_page', 8); // Устанавливаем 8 записей на главной странице
}
if (is_search()) {
$query->set('posts_per_page', -1); // Показываем все результаты поиска
}
if (is_archive()) {
$query->set('posts_per_page', 25); // Устанавливаем 25 записей в архивах
} //endif
} //function
// Добавляем функцию выше к действию 'pre_get_posts'
add_action('pre_get_posts', 'custom_posts_per_page');

Да, я упомянул об этом в своем вопросе. Я ищу способ сделать это, чтобы мне не приходилось редактировать несколько файлов темы для изменения настроек. Спасибо.

Дополнение к этому вопросу. Кто-нибудь знает, как определить post_per_page для этой функции function custom_posts_per_page($query), если добавить новую страницу в index.php следующим образом:
<?php
if ($_GET['new'] == 1)
{
include ( TEMPLATEPATH . '/newpage.php' );
exit;
}
?>

Я понимаю, что могу сделать это, редактируя файлы темы и изменяя параметры запроса там, но я бы предпочел иметь более простой доступ к странице настроек.
Для полноты картины я обнаружил, что комбинация query_posts
с конкатенацией $query_string
работает хорошо.
Я разместил этот код в index.php
(в моей теме нет category.php) ...
<?php
if (!is_front_page()) {
query_posts($query_string . "&posts_per_page=20");
}
?>
Конечно, здесь мы изменяем внутреннюю строку запроса цикла, переопределяя стандартное количество записей на страницу.
Это отлично работает для отображения меньшего списка записей на главной странице, где я показываю полные записи, и гораздо большего списка записей везде остальных местах (категории, по дате и т.д.), где я отображаю только краткие описания.
Однако, обратите внимание, что в отличие от принятого ответа, этот код запускает запрос дважды, поэтому это не самое оптимальное решение.

Джефф, я искал централизованное место для управления количеством постов, возвращаемых в разных контекстах. Твой ответ работает только если использовать index.php для обработки ВСЕХ контекстов, что делают не все темы. Помимо увеличения количества запросов к базе данных (что влияет на производительность), твой метод может также неожиданно изменить поведение условных тегов (например, is_home() или is_front_page). Наконец, если ты хочешь добавить дополнительные циклы на страницу, тебе НЕ следует использовать query_posts, а лучше использовать "new WP_Query" (или get_posts).

@doug это не дополнительный цикл, а переопределение основного — и да, эта конкретная тема использует index.php для рендеринга всего, она довольно минималистичная. Я посчитал, что мой ответ здесь более уместен, но если хочешь, я могу задать отдельный вопрос и ответить на него, если этот ответ тебя чем-то задел.

Вообще-то я неверно прочитал твой предпоследний абзац и подумал, что списки постов "больше" и "меньше" находятся на одной странице, так что моё последнее предложение было неуместным. И да, совершенно нормально размещать весь код в index.php, если ты этого хочешь. И если это так, то твой метод — быстрый и простой способ сделать это, так что я уберу свой минус после истечения 20-часовой блокировки. Тем не менее, отправка нового запроса вместо изменения исходного, как в ответе kevtrout, менее желательна по причинам, уже упомянутым (и тобой, и мной, и в WP Codex).
