Решение проблем с постраничной навигацией
2014-03-07“Ура! Заработало!” – этот радостный клич рвется из моей груди после того, как я потратила четыре бессонных часа для решения проблемы с отображением постраничной навигации на своем главном сайте. Наконец-то найдено верное решение, реализована поставленная задача, и я спешу сохранить результат потраченных усилий в этой статье.
Для осуществления постраничной навигации я использовала на своем сайте способ пагинации без использования плагинов, известный как Corenavi.
Навигация прекрасно работала на главной странице, для перемещения по страницам новостей, состоящих из записей всех имеющихся категорий. Однако с наполнением сайта большим числом записей возникла необходимость разбить на страницы и отдельные разделы. Вот тут-то я и столкнулась с проблемой – при добавлении к циклу для вывода записей отдельной категории
1 2 3 4 5 6 7 8 |
<?php global $post; $args = array('category' => 4, 'numberposts' => 8); $myposts = get_posts( $args ); foreach( $myposts as $post ) : setup_postdata($post); ?> <h2><a href="<?php the_permalink (); ?>"><?php the_title () ; ?></a></h2> <?php the_excerpt (); ?> <?php endforeach; ?> |
строки вывода постраничной навигации
1 |
<?php if (function_exists('wp_corenavi')) wp_corenavi(); ?> |
ничего не происходило.
Я пробовала использовать различные циклы и способы для вывода записей одного отдельного раздела (категории), но в паре с попыткой вывести постраничную навигацию получала то отсутствие навигации, то вообще пустую страницу.
На данный момент мои познания в PHP ограничены основными сведениями, необходимыми для построения тем для WordPress, а потому в поиске помощи для решения поставленной задачи я обратилась к наработкам старших товарищей, проще говоря “загуглила” и “заяндексила” свою проблему. На мое удивление, список предлагаемых способов решения проблем с навигацией оказался не так уж и велик, как я предполагала, а самое обидное, мне ни один из них не помогал…
В итоге многих проб и отчаянных экспериментов я остановилась на том, что взяла используемый на главной странице сайта цикл с нормально работающей навигацией
1 2 3 4 5 6 7 |
<?php if (have_posts ()) : ?> <?php while (have_posts ()) : the_post () ; ?> <h2><a href="<?php the_permalink (); ?>"><?php the_title () ; ?></a></h2> <?php the_excerpt (); ?> <?php endwhile; ?> <?php if (function_exists('wp_corenavi')) wp_corenavi(); ?> <?php endif; ?> |
и добавила перед ним функцию query_posts с указанием нужной категории и количества записей на одной странице:
1 |
<?php query_posts('cat=4&showposts=8')?> |
При этом внизу редактируемой страницы наконец-то появлялись кнопки постраничной навигации!
Однако при переходе с ее помощью на следующую страницу в браузере отображалось содержимое первой странички! В адресной строке менялись номера страниц, например, http://sait.ru/recepties/page/3/, http://sait.ru/recepties/page/4/, но все они были точными копиями друг друга и первой страницы!
Никакие из найденных на просторах интернета советы мне не помогали, но интуитивно я чувствовала, что получившийся код – самый верный для достижения моей цели. Просто чего-то в нем не хватает…
1 2 3 4 5 6 7 8 |
<?php query_posts('cat=4&showposts=8')?> <?php if (have_posts ()) : ?> <?php while (have_posts ()) : the_post () ; ?> <h2><a href="<?php the_permalink (); ?>"><?php the_title () ; ?></a></h2> <?php the_excerpt (); ?> <?php endwhile; ?> <?php if (function_exists('wp_corenavi')) wp_corenavi(); ?> <?php endif; ?> |
Уже хотела выключать компьютер, оставив все как есть, без постраничной навигации, но чувство, что от решения проблемы меня отделяет всего одна-две строчки кода не оставляло меня. Да и смогу ли я спокойно спать, зная, что задача осталась нерешенной и в следующий раз мне придется все начинать сначала? Я поглубже вдохнула и снова углубилась в поиски.
И, счастье! Все же нашла эту статью и смогла устранить проблему с выведением одного и того же контента при переходе на другую страницу посредством постраничной навигации!
Оказалось, что интуиция подсказывала мне верное направление и для того, чтобы все на моем сайте заработало как надо, мне действительно не хватало пары строк кода.
Вот они, эти золотые строки!
1 2 3 |
<?php $page = (get_query_var('paged')) ? get_query_var('paged') : 1; query_posts("paged=$page") ?> |
Нужно подставить их перед циклом вывода записей вместо строки
1 |
<?php 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′);
В моем случае нужно было вывести записи категории 4 и ограничить их число на одной странице значением 8 штук. Поэтому получился следующий код:
1 2 3 |
<?php $page = (get_query_var('paged')) ? get_query_var('paged') : 1; query_posts("paged=$page&cat=4&showposts=8") ?> |
Теперь постраничная навигация работает как надо и я могу использовать данное решение для других индивидуальных страниц категорий и прочих задач. Чем сейчас и займусь ))
Главное – отныне у меня есть памятка по теме решения проблем с постраничной навигацией. Надеюсь, эта вебмастерская заметка будет полезна и вам.