Подружить query_posts и постраничную навигацию

Вторник, 22 Мар 2011 4:34

Когда речь идет о реализации на WordPress более-менее серьезных сайтов, очень часто встает вопрос о циклах вывода записей с самыми различными условиями: из категории «новости», по 15 записей на странице, только те, которые (не)отмечены тегом «горячие», и т.п. В таких ситуациях всегда выручает query_posts, который по сути является тем же WP_Query и позволяет вывести записи практически с любыми условиями.

Рассмотрим ситуацию, когда мы захотели, скажем, на всех страницах сайта, в том числе и на странице категории, выводить по 10 записей на страницу, а на страницах подкатегорий выводить по 20 записей на страницу. Вопрос отделения на уровне функций конкретно подкатегорий в этой статье опустим, а рассмотрим только вопрос организации такой постраничной навигации. В данном случае общеизвестный плагин different_posts_per_pages не подойдет, т.к. он умеет задавать произвольное число записей для главной страницы, страниц ВСЕХ категорий (то есть столько записей, сколько мы зададим выводить на странице категорий, будет выводиться и на страницах подкатегорий), страниц архивов и так далее, но не умеет различать категории и подкатегории. На помощь нам приходит query_posts с условиями posts_per_page=20 и cat= $cat (переменная $cat всегда хранит id текущей категории):

<? query_posts('posts_per_page=20&cat=' . $cat); ?>

И действительно, таким образом мы будем получать по 20 записей на странице, однако, при попытке перейти на следующую страницу мы увидим, что выведутся те же самые 20 записей. И действительно, ведь query_post по сути помимо переданных ей параметров все остальные параметры берет дефолтными, т.е. если ей явно не задать, с какой страницы 20 записей вы хотите получить, он все время будет выводить последние 20 записей (первую страницу). Поведение функции вполне логично, осталось передать функции номер страницы. Погуглив немного, на одном форуме о создании сайтов я нашел простое и изящное решение. Делается это с помощью глобальной переменной $paged:

<? $paged = (get_query_var('paged')) ? get_query_var('paged') : 1; query_posts('showposts=20&paged='.$paged.'&cat='.$cat); ?>

Данное условие гласит: если удалось получить номер страницы, то присваиваем переменной $paged номер страницы и передаем ее в качестве параметра функции query_posts. Если не удалось получить номер страницы, то присваиваем переменной $paged единицу и передаем ее в качестве параметра функции query_posts.

Данная строчка кода вставляется непосредственно перед циклом вывода постов:

<? if (have_posts()) : ?>
<? while (have_posts()) : the_post(); ?>

Вуаля! Постраничная навигация с query_posts() больше не проблема.

Теги: 

http://blogto4ka.ru

RSS комментариев

Один комментарий Упоминаний: 1 Комментировать

  1. Андрей пишет:

    24 Окт 2011 в 15:36 Reply to this comment

    1

    Большое спасибо! Я так долго искал решение и вы мне помогли))))))) Все работает как часы))))))

Оставьте свой комментарий о материале
(Комментарии со ссылками попадают на модерацию. Остальные не попадают, но я могу удалять те, которые посчитаю бесполезными, не несущими смысловой нагрузки)