Як було зазначено у вступній частині цієї серії статей, клас WP_Query складається з чотирьох основних елементів:
- Аргументи для запиту – про них ми поговоримо більш детально в наступних статтях з цієї серії;
- Сам запит;
- Цикл – відображає вміст запису, заголовки або все те, що вам потрібно вивести на екран;
- Заключна секція – тут закриваються теги if і while, а також скидаються дані записи.
У сьогоднішньому керівництві ми хочемо розповісти вам, як використовувати цикли з WP_Query, включаючи два основних методи їх структурування, а також використання декількох циклів.
Де доречно використовувати цикли
Після того як WordPress запускає запит з використанням вказаних вами аргументів, йому потрібно повідомити, що з отриманих даних треба відобразити на сторінці. Саме тут у дію вступає цикл.
При цьому найчастіше використовуються три конструкції:
- if($query->have_posts()) — перевіряє наявність записів;
- while($query->have_posts()) — повторює цикл після кожного запису;
- $query->the_post() — здійснює доступ до конкретного запису.
Цикл в класі WP_Query виглядає наступним чином:
have_posts() ) {
// початок циклу обробки даних з результатів запиту.
while ( $query->have_posts() ) {
$query->the_post();
// тут відображається результат, отриманий при перевірці вмісту запису.
}
}
// Відновлення вихідних даних запису.
wp_reset_postdata();
?>
Структура циклу
Структура вашого циклу, залежить від того, які дані запису ви хочете вивести на екран. Пропонуємо вам приклад циклу, який виводить заголовок запису, мініатюру і уривок з тексту:
have_posts() ) {
// початок циклу обробки даних з результатів запиту.
while ( $query->have_posts() ) {
$query->the_post();
?>
Перевірка вмісту за допомогою циклів
Іноді перед списком записів потрібно вивести заголовок, або ж помістити всі записи в окремий елемент. Якщо ви додасте теги перед циклом, то вони будуть просто з’являтися на сторінці без повернення даних. Тобто виведеться лише один заголовок або вся розмітка.
Цю проблему легко вирішити, якщо помістити елемент або заголовок всередину самого тега:
have_posts() ) {
echo «;
echo ‘
‘. __( ‘Heading’, ‘tutsplus’ ) . ‘
‘;
// початок циклу обробки даних з результатів запиту
while ( $query->have_posts() ) {
$query->the_post();
?>
Спочатку ми перевіряємо, повернув наш запит які-небудь записи. Якщо так, то ми відкриваємо містить елемент і додаємо в нього заголовок. Давайте припустимо, що нам потрібно створити список з усіма записами з певної рубрики.
Елемент списку ul знаходиться за межами нашого циклу, так як не пов’язаний з якоюсь певною записом, і нам потрібно виводити його тільки при наявності записів:
‘category-slug’,
‘post_type’ => ‘post’
);
// довільний запит.
$query = new WP_Query( $args );
// перевірка наявності результатів запиту.
if ( $query->have_posts() ) {
echo ‘
- ‘;
- posts_per_page’ => ‘1’, використовується в першому запиті для виведення останнього запису;
- ‘offset’ = ‘1’, використовується у другому запиті, пропускає найсвіжішу запис, щоб уникнути її повторення у створеному списку.
// початок циклу обробки даних з результатів запиту.
while ( $query->have_posts() ) {
$query->the_post();
?>
‘;
}
// відновлення вихідних даних запису.
wp_reset_postdata();
?>
Ми перевіряємо, витягнув запит які-небудь записи, і якщо так, то ми відкриваємо ul-елемент, а потім запускаємо цикл.
Запуск додаткових циклів
jQuery можна використовувати для запуску декількох циклів, але для цього потрібно відновлювати дані записи після кожного циклу, і тільки потім запускати другий екземпляр класу WP_Query. Тому що кожен цикл буде повертати дані на основі заданих йому значень аргументів.
У цьому прикладі виводиться уривок тексту і мініатюра з першого запису, а потім заголовки кожної наступної запису:
‘post’,
‘posts_per_page’ => ‘1’
);
// перший довільний запит.
$query1 = new WP_Query( $args1 );
// перевірка наявності результатів запиту.
if ( $query1->have_posts() ) {
// початок циклу обробки даних з результатів запиту.
while ( $query1->have_posts() ) {
$query1->the_post();
?>
‘1’,
‘post_type’ => ‘post’
);
// другий довільний запит.
$query2 = new WP_Query( $args2 );
// перевірка наявності результатів запиту.
if ( $query2->have_posts() ) {
echo ‘
- ‘;
// початок циклу обробки даних з результатів запиту.
while ( $query2->have_posts() ) {
$query2->the_post();
?>
‘;
}
// відновлення вихідних даних запису.
wp_reset_postdata();
?>
Тут ми використовували два ключових аргументу:
Як видно з прикладу, цикл лише злегка відрізняється для кожного запиту. Перший запит виводить мініатюру, заголовок і витяг із найсвіжішою запису, а другий запит перевіряє наявність записів в запиті. Якщо вони є, то відкриває ul-елемент і включає в нього заголовок кожного запису, обрамлений в елемент li із зазначенням посилання на сторінку записи.
Після обох циклів використовується функція wp_reset_postdata(). Якби ми не використали її, то другий цикл повторно виводив би дані, починаючи з самої свіжої запису.
На завершення
Цикл – це код, який ви використовуєте для виводу даних, які WordPress витяг з бази даних, керуючись аргументами вашого запиту.
Простий цикл виводить всі записи в порядку, зазначеному в аргументах запиту (або за датою за замовчуванням). Якщо ви розділите if( $query->have_posts() ) і while( $query->have_posts() ), то зможете використовувати додаткову розмітку прямо всередині циклу, але тільки, якщо запит повернув які-небудь дані. І, нарешті, вказуючи альтернативні аргументи і використовуючи функцію wp_reset_postdata() після кожного циклу, ви можете застосовувати WP_Query кілька разів в рамках окремої сторінки.
Переклад статті «Mastering WP_Query: Using the Loop» був підготовлений дружною командою проекту Сайтостроение від А до Я.