Вывод на первой странице записей одной категории и постраничная навигация при query_posts
июня 6, 2010 | by Макс |Бывает, человеку очень хочется, чтобы на первой странице его блога выводились посты только из одной категории - например, “Новости”. Человек этот не особо заморачивался с темой блога, в папке темы у него не лежит ни single.php, ни category.php - все формируется по единому шаблону. Но вот для первой страницы человек решил сделать исключение.
Итак, первое, что ему надо сделать, добавить папку с темой файл home.php. Затем скопировать туда содержимое из файла index.php. Затем найти строчки, где начинается The Loop:
и перед ними добавить
query_posts('cat=1');
// здесь вместо цифры 1 надо подставить id нужной категории
?>
Вот теперь первая страница блога формируется в соответствии с шаблоном home.php, а все остальные в соответствии с index.php. Только, вот беда, плохо работают ссылки на предыдущие страницы - то есть, если захотеть отмотать новости назад, ничего не выйдет.
Поступим здесь точно так же, как я уже писал однажды на похожую тему: вместо query_posts(”cat=1″) напишем примерно такое
<?php $numpost=10;//сколько записей на одной странице нам надо вывести
if($paged>1) $offset=$numpost*($paged-1);
else $offset=0;//чтобы знать, с какой статьи начать, если это не первая страница
query_posts(’cat=1&offset=’.$offset.’&showposts=’.$numpost); ?>
<?php if (have_posts()) : while (have_posts()) : the_post(); ?>
Теперь должно работать :-)
(в старых версиях ВП вместо параметра showposts использовался posts_per_page).
Если количеством записей необходимо управлять из админки (Настройки - Чтение). В примере выше количество выводимых записей ограничено в самом коде: $numpost=10, или плагин wp-pagenavi отказывается работать как положено, то может помочь следующий код:
<?php if (have_posts()) : while (have_posts()) : the_post(); ?>
Если вышеописанное не помогает и при использовании в шаблоне query_posts перестает работать постраничная навигация - при переходе на следующую страницу отображается тот же самый контент. Проблема решается путем добавлению к циклу всего 2-х строк кода.
Необходимо найти код начала цикла:
<?php while (have_posts()) : the_post(); ?>
и вставить перед ним следующий код:
$page = (get_query_var('paged')) ? get_query_var('paged') : 1;
query_posts("paged=$page");
?>
Ну и, естественно, если необходимо, в query_posts можно добавить дополнительные параметры, например, количество постов в этом цикле или рубрику, из которой из выбирать.
Еще немного подробностей о query_posts()
- если нужно подкорректировать всего один параметр (к примеру, мы хотим на странице автора выводить другое, чем обычно, количество постов), то к этому параметру надо прибавлять переменную $query_string, которая позволит не “забыть” про все остальное. Выглядеть это должно примерно так: $query_posts($query_string.”&showposts=5″);
- если надо вывести все категории, кроме одной, пишем query_posts(”cat=-3″);
- если надо вывести все категории, кроме нескольких, пишем query_posts(”cat=-1,-2,-3″);
- если вместо постов надо вывести содержимое страницы, пишем query_posts(’page_id=7′); или query_posts(’pagename=about’);
- если нам нужен какой-то конкретный пост, пишем query_posts(’p=1′); или query_posts(”name=first-post”);
- если нам нужны записи за конкретный год и месяц, пишем query_posts(’monthnum=12&year=2004′);
h++p://blog.trampampam.ru/wordpress/query_posts/
h++p://www.sonika.ru/blog/wordpress/query-posts-navigation.htm
h++p://wphacks.name/pagination-on-query-posts/
Теги: функции WordPress

By Люк on августа 10, 2010
СПАСИБО ВАМ ОГРОМНОЕ!
By St.eV on августа 18, 2010
Спасибо за пост.
Эта строчка
буквально спасла меня :)