Здравствуй, дорогой читатель!
Сегодня хочу продолжить пополнять копилку разработчика WordPress и познакомлю Вас с четырьмя способами задания главного цикла WordPress, получил он название в народе loop. Циклом называется, потому что это запрос к базе данных на наличе постов/записей в определенной таблице и если они есть то с помощью цикла while
происходит перебор всех записей и отображение каждой из них на блоге с помощью специальных тегов WordPress.
Для начала следует понимать, что loop — это основа, так сказать сердце любой темы и важно корректно его использовать.
Loop, который WordPress использует по умолчанию Вы можете найти в файле index.php cтандартной темы (на данный момент twentytwelve) начинается он обычно строками if(have_posts())
и содержит в себе всю разметку записи или списка записей. Как это ни странно но стандартный цикл прекрасно работает для большинства «одноцикловых» тем, но когда требуется создавать более сложные шаблонные конструкции, использующие для вывода информации несколько циклов или для вывода произвольных типов записей, то в таких случаях использовать стандартный цикл не получится. К счастью разработчики позаботились об этой проблеме и есть 4 способа задать цикл WordPress:
- Стандартный цикл
- Цикл c query_posts()
- Цикл c WP_Query()
- Цикл c get_posts()
Каждый из приведенных циклов выполняет по сути одну и ту же задачу: выводит записи или список записей, удовлетворяющих определенным заданным параметрам. Давайте подробно рассмотрим каким образом использовать цикл в создании темы.
Стандартный цикл
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
|
<span class="pun"><?</span><span class="pln">php </span><span class="kwd">if</span> <span class="pun">(</span><span class="pln">have_posts</span><span class="pun">())</span> <span class="pun">:</span> <span class="pun">?></span> <span class="pun"><?</span><span class="pln">php </span><span class="kwd">while</span> <span class="pun">(</span><span class="pln">have_posts</span><span class="pun">())</span> <span class="pun">:</span><span class="pln"> the_post</span><span class="pun">();</span> <span class="pun">?></span><span class="pln"> <div </span><span class="pun"><?</span><span class="pln">php post_class</span><span class="pun">();</span> <span class="pun">?></span><span class="pln"> id="post-</span><span class="pun"><?</span><span class="pln">php the_ID</span><span class="pun">();</span> <span class="pun">?></span><span class="pln">"> </span><span class="tag"><h1></span><span class="pln"><a href="</span><span class="pun"><?</span><span class="pln">php the_permalink</span><span class="pun">();</span> <span class="pun">?></span><span class="pln">"></span><span class="pun"><?</span><span class="pln">php the_title</span><span class="pun">();</span> <span class="pun">?></span><span class="tag"></a></h1></span> <span class="pun"><?</span><span class="pln">php the_content</span><span class="pun">();</span> <span class="pun">?></span> <span class="tag"></div></span> <span class="pun"><?</span><span class="pln">php endwhile</span><span class="pun">;</span> <span class="pun">?></span> <span class="tag"><div</span> <span class="atn">class</span><span class="pun">=</span><span class="atv">"navigation"</span><span class="tag">></span> <span class="tag"><div</span> <span class="atn">class</span><span class="pun">=</span><span class="atv">"next-posts"</span><span class="tag">></span><span class="pun"><?</span><span class="pln">php next_posts_link</span><span class="pun">();</span> <span class="pun">?></span><span class="tag"></div></span> <span class="tag"><div</span> <span class="atn">class</span><span class="pun">=</span><span class="atv">"prev-posts"</span><span class="tag">></span><span class="pun"><?</span><span class="pln">php previous_posts_link</span><span class="pun">();</span> <span class="pun">?></span><span class="tag"></div></span> <span class="tag"></div></span> <span class="pun"><?</span><span class="pln">php </span><span class="kwd">else</span> <span class="pun">:</span> <span class="pun">?></span><span class="pln"> <div </span><span class="pun"><?</span><span class="pln">php post_class</span><span class="pun">();</span> <span class="pun">?></span><span class="pln"> id="post-0"> </span><span class="tag"><h1></span><span class="pln">Ничего не найдено</span><span class="tag"></h1></span> <span class="tag"></div></span> <span class="pun"><?</span><span class="pln">php endif</span><span class="pun">;</span> <span class="pun">?></span> |
Стандартный цикл включает в себя условие (if
) и перебор (while
). Условие на наличие постов, если постов нет то выводится контейнер с сообщением, что записей нет, а если записи есть то с помощью перебора отображается контент записи. Контент записи выводится стандартными тегами WordPress: the_title
, the_content
, the_excerpt
, the_permalink
и так далее. Количество отображаемых записей на страницах блога/сайта можно указать в настройках панели управления в разделе «Чтение».
Цикл с query_posts()
Функция query_posts()
позволяет полностью изменить стандартный цикл, также с ее помощью можно установить только некоторые параметры для стандартного цикла.
|
<span class="pun"><?</span><span class="pln">php </span><span class="kwd">global</span><span class="pln"> $query_string</span><span class="pun">;</span> <span class="com">/* обязятельно объявлем!!! */</span><span class="pln"> $posts </span><span class="pun">=</span><span class="pln"> query_posts</span><span class="pun">(</span><span class="pln">$query_string</span><span class="pun">.</span><span class="str">'&posts_per_page=15&cat=-1,-2,-3'</span><span class="pun">);</span> <span class="com">/* исключаем отображение записей из трех категорий 1,2,3 и устанавливаем к-во отображаемых записей */</span> <span class="pun">?></span> <span class="pun"><?</span><span class="pln">php </span><span class="com">/* Здесь пишем стандартный цикл */</span> <span class="pun">?></span> <span class="pun"><?</span><span class="pln">php wp_reset_query</span><span class="pun">();</span> <span class="com">/* обязятельно сбрасываем цикл */</span> <span class="pun">?></span> |
У функции query_posts() есть много настраиваемых параметров, почитать о их применении можно в кодексе WordPress. Использовать этот тип задания цикла отлично подходит для задания параметров одного цикла, для задания нескольких циклов целесообразно использовать следующие функции.
Цикл с WP_Query()
Для лучшей функциональности и задания нескольких циклов рекомендуют использовать функцию WP_Query(). Она принимает такие же параметры как и query_posts(), но слегка отличается заданием цикла:
|
<span class="pun"><?</span><span class="pln">php $custom_query </span><span class="pun">=</span> <span class="kwd">new</span><span class="pln"> WP_Query</span><span class="pun">(</span><span class="str">'cat=-9'</span><span class="pun">);</span> <span class="com">/* исключаем категорию с айди 9 */</span> <span class="kwd">while</span><span class="pun">(</span><span class="pln">$custom_query</span><span class="pun">-></span><span class="pln">have_posts</span><span class="pun">())</span> <span class="pun">:</span><span class="pln"> $custom_query</span><span class="pun">-></span><span class="pln">the_post</span><span class="pun">();</span> <span class="pun">?></span><span class="pln"> <div </span><span class="pun"><?</span><span class="pln">php post_class</span><span class="pun">();</span> <span class="pun">?></span><span class="pln"> id="post-</span><span class="pun"><?</span><span class="pln">php the_ID</span><span class="pun">();</span> <span class="pun">?></span><span class="pln">"> </span><span class="tag"><h1></span><span class="pln"><a href="</span><span class="pun"><?</span><span class="pln">php the_permalink</span><span class="pun">();</span> <span class="pun">?></span><span class="pln">"></span><span class="pun"><?</span><span class="pln">php the_title</span><span class="pun">();</span> <span class="pun">?></span><span class="tag"></a></h1></span> <span class="pun"><?</span><span class="pln">php the_content</span><span class="pun">();</span> <span class="pun">?></span> <span class="tag"></div></span> <span class="pun"><?</span><span class="pln">php endwhile</span><span class="pun">;</span> <span class="pun">?></span> <span class="pun"><?</span><span class="pln">php wp_reset_postdata</span><span class="pun">();</span> <span class="com">// reset the query </span><span class="pun">?></span> |
Для задания цикла с помощью функции WP_Query()
нам не нужна переменная query_string и для задания парметров цикла мы можем использовать теже параметры что и для query_posts(). Для того чтобы задать несколько циклов можете воспользоваться следующим шаблоном:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
|
<span class="pun"><?</span><span class="pln">php </span><span class="com">// Цикл 1</span><span class="pln"> $one_query </span><span class="pun">=</span> <span class="kwd">new</span><span class="pln"> WP_Query</span><span class="pun">(</span><span class="str">'cat=-1'</span><span class="pun">);</span> <span class="com">// исключаем категорию</span> <span class="kwd">while</span><span class="pun">(</span><span class="pln">$first_query</span><span class="pun">-></span><span class="pln">have_posts</span><span class="pun">())</span> <span class="pun">:</span><span class="pln"> $one_query</span><span class="pun">-></span><span class="pln">the_post</span><span class="pun">();</span> <span class="pun">...</span><span class="pln"> endwhile</span><span class="pun">;</span><span class="pln"> wp_reset_postdata</span><span class="pun">();</span> <span class="com">// Цикл 2</span><span class="pln"> $two_query </span><span class="pun">=</span> <span class="kwd">new</span><span class="pln"> WP_Query</span><span class="pun">(</span><span class="str">'cat=-2'</span><span class="pun">);</span> <span class="com">// исключаем категорию</span> <span class="kwd">while</span><span class="pun">(</span><span class="pln">$second_query</span><span class="pun">-></span><span class="pln">have_posts</span><span class="pun">())</span> <span class="pun">:</span><span class="pln"> $two_query</span><span class="pun">-></span><span class="pln">the_post</span><span class="pun">();</span> <span class="pun">...</span><span class="pln"> endwhile</span><span class="pun">;</span><span class="pln"> wp_reset_postdata</span><span class="pun">();</span> <span class="com">// Цикл 3</span><span class="pln"> $three_query </span><span class="pun">=</span> <span class="kwd">new</span><span class="pln"> WP_Query</span><span class="pun">(</span><span class="str">'cat=-3'</span><span class="pun">);</span> <span class="com">// исключаем категорию</span> <span class="kwd">while</span><span class="pun">(</span><span class="pln">$third_query</span><span class="pun">-></span><span class="pln">have_posts</span><span class="pun">())</span> <span class="pun">:</span><span class="pln"> $three_query</span><span class="pun">-></span><span class="pln">the_post</span><span class="pun">();</span> <span class="pun">...</span><span class="pln"> endwhile</span><span class="pun">;</span><span class="pln"> wp_reset_postdata</span><span class="pun">();</span> <span class="pun">?></span> |
Каждый дополнительный цикл может быть размещены в любом месте шаблона вашей темы, причем не обязательно использовать их последовательно. Например, один цикл можете размещестить в сайдбаре, другой в шапке, третий в подвале и так далее. Как плюс каждому циклю можно задатьуникальную конфигурацию.
Использовать WP_Query() целесообразно для создания нескольких, индивидуальных циклов, с его помощью можно задать любое необходимое к-во циклов. Подробнее о функции WP_Query() в кодексе WordPress
Цикл с get_posts()
Использование функции get_posts()
самый простой и безопасный способ для задания нескольких циклов. В любом месте Вашей темы где Вы хотите задать цикл функция get_posts будет идеальным решением. Задается цикл с ее помощью, таким образом:
|
<span class="pun"><?</span><span class="pln">php </span><span class="kwd">global</span><span class="pln"> $post</span><span class="pun">;</span> <span class="com">/* Обязательно */</span><span class="pln"> $args </span><span class="pun">=</span><span class="pln"> array</span><span class="pun">(</span><span class="str">'category'</span> <span class="pun">=></span> <span class="pun">-</span><span class="lit">9</span><span class="pun">);</span> <span class="com">/* исключаем категорию с айди 9 / $custom_posts = get_posts($args); foreach($custom_posts as $post) : setup_postdata($post); <a href="<?php the_permalink(); </span><span class="pun">?></span><span class="pln">"></span><span class="pun"><?</span><span class="pln">php the_title</span><span class="pun">();</span> <span class="pun">?></span><span class="tag"></a></span> <span class="pun"><?</span><span class="pln">php the_content</span><span class="pun">();</span> <span class="pun">?></span><span class="pln"> endforeach; wp_reset_postdata(); </span><span class="pun">?></span> |
Функция get_posts() требует массива параметров, кстати параметры к ней подходят от функций WP_query()
и query_posts()
, исключениями являются:
numberposts
вместо post_per_page
category
вместо cat
Подробнее о функции get_posts() читайте в кодексе WordPress
Подведем итоги
Как и обещалось мы раскрыли секреты задания и изменения цикла WordPress, напомню что когда используется:
- query_posts() — используется для изменения стандартного цикла
- WP_Query() — использется для изменения цикла или для создания нескольких циклов
- get_posts() — используется для создания нескольких дополнительных циклов
Спасибо за внимание, буду признателен за комментарии и распространении ссылки на статью в социальных сетях!