Апр
27
35

WordPress цикл (loop) – выводим сообщения блога

Возникла задача для одного из блогов запретить вывод на главную страницу постов из определенной категории. Самое время залезть и немного покопаться в кодексе дабы правильно изменить наш шаблон. Использовать при этом какие-то плагины wordpress, думаю, смысла нет, ведь все решается гораздо проще. Но для начала немного теории.

Итак, wordpress цикл (или loop) используется для отображения каждого из постов вашего блога. С помощью цикла система вордпресс обрабатывает каждый пост и отображает его на текущей страницы, исходя из тех или иных заданных критериев. Любой код HTML или PHP, который указан в цикле, будет применен для всех отображаемых постов. При этом для соответствующих функций в кодексе четко указывается, что мол она может быть использована только в цикле wordpress. Так, например, с помощью цикла на главной странице блога для каждой записи задается оформление (обработка) ее заголовка, категорий и т.п. Таким образом, вы указываете форматирование единожды, а оно применяется ко всем статьям.

Если вы откроете главный файл шаблона index.php, то сможете найти в коде строки, отвечающие за цикл wordpress. Начинается он здесь:

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

А заканчивается чаще всего таким кодом:

<?php endwhile; else: ?>
<p><?php _e('Sorry, no posts matched your criteria.'); ?></p>
<?php endif; ?>

В принципе, ничего сложного быть не должно. Дабы закрепить материал предлагаю взглянуть на парочку примеров.

Допустим, что у нас есть задача сделать отдельное оформление для категории постов под номером 3 (цифру ищите в админке блога разделе категорий при наведении на ее заголовок). Для вывода используем все тот же цикл Loop, а для проверки принадлежности к той или иной категории функцию in_category(). Итого получаем:

<?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>
<?php if ( in_category('3') ) { ?>
          <div class="post-cat-three">
<?php } else { ?>
          <div class="post">
<?php } ?>
<h2><a href="<?php the_permalink() ?>" rel="bookmark" title="Permanent Link to <?php the_title_attribute(); ?>"><?php the_title(); ?></a></h2>
…
<?php endwhile; else: ?>
 <p>Sorry, no posts matched your criteria.</p>
 <?php endif; ?>

Здесь в центре кода есть условие – если пост принадлежит категории под номером 3, то для его оформления применится стиль post-cat-three, в противном случае обычный. Учитывая тот вариант, что код проверки находится в цикле wordpress, мы производим автоматически проверку для всех постов блога.

Исключаем посты из цикла для определенной категории

Собственно теперь рассмотрим пример, с которого все и началось. С помощью функции query_posts мы можем изменить параметры цикла wordpress для вывода постов блога на главной странице. Например, мы хотим исключить из вывода  категории 3 и 8, тогда используем код:

<?php query_posts($query_string . '&cat=-3,-8'); ?>
<?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>
<div class="post">
<h2><a href="<?php the_permalink() ?>"><?php the_title(); ?></a></h2>
 <div class="entry"><?php the_content(); ?></div>
 <p class="postmetadata">Posted in <?php the_category(', '); ?></p>
</div>
<?php endwhile; else: ?>
<p>Sorry, no posts matched your criteria.</p>
<?php endif; ?>

Внимание! При этом вы должны убедиться, что используете отдельный файл шаблона для вывода архивов категорий и др., то есть поищите у себя archive.php. В противном случае исключение категорий 3 и 8 будет применено и к архивам, чего мы делать не планировали.

В кодексе для этого есть небольшое решение с помощью функции is_home():

<?php if ( is_home() ) {
query_posts($query_string . '&cat=3,-8');
}
?>

Пока что на этом все, другие «истории» из кодекс рассмотрю в следующих статьях.

рейтинг Оцените статью:
Ужасная статьяНичего интересногоТак себеНормальноХорошоКлассный постВ закладки!
(голосов - 4, средний балл: 6,50 из 7)
Загрузка...

категория Категории: Возможности; Начинающим;
теги Теги: , , , , .

комментариев 35 к статье “WordPress цикл (loop) – выводим сообщения блога”

  • Евгений   28.04.2010

    Александр, спасибо. Интересует следующий вопрос. Можно ли что-то подобное организовать для каждой страницы тега в wordpress. Т.е. чтобы вверху перед записями по тегу выводилось «приветствие», конечно, оптимизированное под поисковые ключи. Не подскажите?

  • Беркут   29.04.2010

    Полезный пост, но, как ни крути, мне по душе пришелся плагин «simply-exclude» :)

  • Bussman   01.05.2010

    Интересный момент, спасибо. Мне, кстати, тоже нравится плагин «simply-exclude», с ним все проще!

  • RodgerFox   02.05.2010

    Евгений, конечно можно. Даже придумал способ, создаёте отдельную стр. ну как page.php и после для опред категори выбираете тот шаблон, в котором уже дописано что вам необходимо.
    2 способ(нужно знать php получше) можно через функцию вызова, но тоже он смотрит какая категория и к ним загружает то что нужно. (либо из другого файла) p.s. это мой стиль написания ИМХО!
    а вообще спс за статью, мб пригодиться.
    ведь как я понимаю в 2 строке после цикла, in_category(‘3’) , метсо неё ( не помню метку) можем написать пост (3) либо другой и для него будет свой стиль. Так хорошо оформлять первую запись в блоге. Хотя помню был другой споосбо.
    И мой вопрос, как сделать цикл, пример- выводиться 10 записей. нужно ввести 2 класса, 1 к честным нововстям(т.е. 2,4,6,8,10) и к нечетным. как с помощью лупа так сделать? подскажите пожалуйста.
    Большое спасибо.

  • Валерий   04.02.2011

    Здравствуйте! А подскажите, пожалуйста, как сделать следующую простую вещь: при использовании «хлебных крошек» все отлично работает на страницах статей, статичных страницах, странице поиска и архивов, НО не работает, при переходе по страницам навигации, т.е. так называемых страница page 1, page 2 и т.д. Эти страницы на Вашем блоге отображаются на главной странице в виде квадратиков. Нажимаем на 2, и видим в строке браузера «http://www.q2w3.ru/page/2/» — т.е. мы находимся на 2-й странице. Так вот именно на этих страницах мне не удается добиться корректной работы «хлебных крошек».
    Я решил пойти таким путем: встроить в шаблон темы там, где осуществляется вывод страниц начиная со 2-й следующий код:
    Главная > Страница , но в силу плохого знания php-функций, не понимаю, что надо прописать в области кода вывода номера текущей страницы.
    Подскажите, что туда надо «приляпать»?

  • Tod   05.02.2011

    Валерий, нужно поискать функцию, которая считывает номер страницы:) Что-то вроде «wordpress get page number» — возможно таковая имеется. Хотя смысла ставить хлебные крошки на страницы архива я не вижу, это в отдельном поста или разделе сайта полезно, а так может и не нужно никому.

  • максим   17.02.2011

    Подскажите, а как сделать что бы на главной была просто статья и выводилась последняя новость?

  • Tod   19.02.2011

    максим, во-первых, можно на главной выводить определенную страницу блога — задается в пункте настроек «Чтение». Но если нужна не страница, а последняя статья, то просто выбираете отображение 1 поста на странице и в тексте не используете «читать далее» — должна выводится полная статья. Еще лучше ставим плагин Different Posts Per Page и настраиваем чтобы на главной была одна запись, на других страницах — сколько нужно.

  • Станислав   26.09.2011

    Ой вывел все криво …

    Добрый день! Хочу попросить помоши в коде.

    Дело происходит в loop-single.php

    1.$my_cat_id // Записываю номер категории в переменную
    2.$my_query = new WP_Query( ‘cat=$my_cat_id&showposts=1′); // Пытаюсь вставить номер текущей категории в запрос. Вот тут то вся и проблема , что он так не дает сделать …
    3.while ($my_query->have_posts()) : $my_query->the_post(); //Читаю запись
    4.Вывожу контент
    5.Закрываю цикл

    Далее идет еще один loop цикл.

    Хотелось бы узнать как передать номер категории в строковый параметр запроса. Спасибо за ответ заранее.

  • Tod   26.09.2011

    Станислав, с loop помню не все так просто, какая стоит задача вообще? что вы хотите (или что нужно) этим кодом сделать в шаблоне?

  • Станислав   26.09.2011

    Хотел задать условие для loop на вывод контента через $my_query = new WP_Query( ‘cat=$my_cat_id&showposts=1′); . И вставить в условие, выбор категории по значению переменной $my_cat_id. Но у меня этот запрос не работал из-за синтаксических проблем. Но теперь я разобрался, данная выше строка должна выглядить так $my_query = new WP_Query( ‘cat=’ . $my_cat_id . ‘&showposts=1′);

    Спасибо за попытку помочь.

  • Катерина   06.02.2012

    Надеюсь на вашу помощь, ибо уже отказываюсь соображать.
    Нужно, чтобы Записи с каждой конкретной Категорией попадали строго на отведенную для этого Страницу. Начиталась, сделала вывод, что в этом мне поможет loop. И везде меня отправляют что-то исправлять в Основной шаблон (index.php), приводя в пример кучу строк кода. А у меня в index.php только эта строка

    Что, где тут исправлять.
    Я, видимо, просто не понимаю. Может кто-то потратит немного времени и даст мне небольшую консультацию.

  • Tod   06.02.2012

    Катерина, код не отобразился, увы. Вообще 99.9% шаблонов именно так и настроены — посты определенной категории отображаются именно на ней, никак иначе. В зависимости от выбранной темы может по разному реализовываться вывод постов — через файл index.php, archive.php или по новому через loop или что-то в этом роде. Я бы посоветовал просто удалить шаблон, потом скачать его и загрузить на ФТП по новой.. просто во всех шаблонах в категориях и выводятся нужные посты, возможно, вы что-то там подправили.

  • Катерина   06.02.2012

    А какую тему нужно поставить, чтобы я ставила категорию на запись и в зависимости от этой категории запись бы попадала на нужную мне страницу?

  • Tod   07.02.2012

    Катерина, да так работает 99% тем, даже та которая по умолчанию. Напишите мне на stod84@gmail.com ссылку на сайт и с какой темой возникли проблемы — я гляну что там к чему.

  • Михаил   11.03.2012

    У меня возникла проблема с постами. Мне показалось, что это близкая тема и возможно кто-то сможет помочь. В общем, я создал свой блог. При добавлении постов они, как и должно быть, отображаются сверху. НО! возникла проблема. после 5-го поста контент идет с самых первых постов и в обратном порядке(пост «комиксы» был самым первым, «из фильмов» вторым и тд)… что делать уже не знаю. И не могу понять, почему если я поставил отображение 5-ти новых постов, отображается почти весь контент. Из-за этого сайт оочень долго грузится( Что мне делать???

  • Tod   11.03.2012

    Михаил, по описанию это какое-то нездоровое поведение — нужно понять в чем именно причина — скорее всего это шаблон, но возможно и плагины какие-то. Подсказать сходу не получится, это непросто, нужно разбираться — я бы попробовал сменить тему и поискать глюк в плагинах.

  • Михаил   11.03.2012

    Tod, проблема в том, что плагины я начал ставить после обнаружения такой «неполадки», пытаясь уладить проблему. Я поставил 2 плагина, связанных с хронологизацией постов, но ничего не помогли((
    а Вы не знаете, где в шаблоне могла бы прятаться проблема? Просто мне нравится этот шаблон и я бы не очень хотел его менять…

  • Tod   11.03.2012

    Михаил, ну, главная страница это либо home.php либо index.php — скорее все это как-то связано с циклом (loop) о котором говорится в статье. Нужно попытаться понять какие именно строки кода вызывают такую реакцию — но предварительно сохраните изначальной сам файл, когда будете тестировать и отключите все плагины.
    Еще можно проверить настройки вордпресс в разделе «Параметры» — общие, написание, чтение и обсуждение.

  • Михаил   11.03.2012

    Tod, скажите, а Вы не могли бы помочь мне разобраться с этими файлами, если я Вам их отправлю? Я новичок в этом деле, это мой первый сайт.. и я не знаю PHP языка(( по этому не знаю в каком именно месте искать ошибку.

  • Михаил   11.03.2012

    Tod, только что попробовал сменить тему, проблема не исчезла((

  • Михаил   22.03.2012

    можно ли вместо главной страницы установить рубрику?? если да, то как это сделать?

  • Tod   24.03.2012

    Михаил, в настройках доступен выбор лишь страниц, поэтому базовыми возможностями вордпресс этого точно сделать нельзя. В принципе, в коде шаблона для цикла loop можно задавать какие категории отображать — смотрите пример с query_posts, там вместо исключения попробуйте указать нужные категории.

  • Михаил   24.03.2012

    Tod, с этим я проблему решил. Спасибо) Остался наверное последний вопрос.. я бы хотел, чтоб перед каждым постом стояло что-то вроде разделителя. У меня есть готовая картинка, но я не знаю, как и куда её ставить в код. Можете подсказать?

    Разделитель такого плана: http://s019.radikal.ru/i621/1203/2f/f45ff7c8a20b.png чтоб в поле уже был заголовок поста и все остальное…

  • Tod   26.03.2012

    Михаил, это вопрос больше по css… нужно посмотреть какой стиль используется для постов и присвоить ему background в виде картинки.

  • rrg   29.03.2012

    А как можно исключить ссылку на текущую категорию, но оставить ссылки на другие категории, если пост одновременно относится к нескольким категориям?
    Например:
    пост относится к сразу к нескольким категориям Растения, Кустарники и Цветы. Когда мы находимся на странице архива категории Цветы, то страница архива должна исключить ссылку на саму категорию Цветы, но оставить ссылки на все остальные категории, если же мы находимся на странице архива категории Кустарники, то ссылки на категории Растения и Цветы должны присутствовать, а ссылка на саму категорию Кустарники должна быть исключена из списка.

    Сейчас ссылки на категории выводит функция , но мне не удается исключать ссылку на текущую категорию.

    Пожалуйста, помогите разобраться.

  • Tod   30.03.2012

    rrg, теоретически сделать это можно с помощью php — то есть считывать к каким категориям относится пост, а потом выводить их вместе со ссылками кроме текущей. В вордпресс для этого есть все нужные функции, но большого смысла в этом нет, то что лишняя ссылка будет на текущую категорию особо на сайт не повлияет, думаю.

  • uZer   16.04.2012

    В интернете нашел тысяча одно описание циклов с различными параметрами. Решил освоиться в вордпрессе и написать под себе собственную тему, максимально отвечающую моим запросам. Но не имея не какого опыта в этом сразу наткнулся на подводные камни. Третий день борюсь с пагинацией. Когда задаю основной цикл , все отлично и при переходах на следующие страницы так же. Но стоит добавить и все перестает быть таким радостным. Первая страница выводиться отлично, но стоит перейти на вторую, шаблон тут же забывает о переданном запросе и начинает выводить все записи. В чем может быть проблема? Пожалуйста помогите((( Я перекопал уже столько материалов, но некак не могу победить эту проблему.

  • Tod   16.04.2012

    uZer, я тоже сталкивался с чем-то подобным при отображении разного количества страниц в блоге, но к сожалению, времени на понимание всех тонкостей цикла не хватило. Я бы поискал еще скрипты разбиения на страницы без плагинов — там может быть нужный участок кода для шаблона.. либо, если вы уже это делали, попробовал через плагины типа WP-PageNavi.

  •  Дарья   18.04.2012

    Помогите, пожалуйста! У меня на странице «статьи» (сайт teplova.info) никак не убирается текст под кат (тег мор не работает). Я чайник в плагинах и кодах. Если не сложно, объясните, что нужно сделать, чтобы он заработал. Спасибо!

Оставить комментарий

(предыдущая статья)

Блог Wordpress Inside поможет вам научиться работать в вордпресс, закрепить и расширить имеющиеся знания. Плагины и шаблоны, разные хаки и функции wp, оптимизация и безопасность системы – все это и намного больше вы сможете найти на страницах нашего проекта!

Если хотите быстро и оперативно получать последние новости и статьи, то рекомендуем подписаться на обновления блога:

Поиск:
Последние посты
Лучшее в категории

Облако тегов
Скажи свое мнение!

В чем основные плюсы Wordpress?

Посмотреть результаты

Загрузка ... Загрузка ...
Друзья проекта
Последние новости