4 способи задати цикл Loop у WordPress
Цикл Loop у WordPress — це серце виведення контенту в темі. Саме через нього WordPress проходить по знайдених записах і підставляє в шаблон заголовок, посилання, уривок, контент, мініатюру, дату та інші дані. Історично багато хто говорить про чотири основні способи задати loop, але в сучасній розробці варто знати не лише класичні варіанти, а й більш правильні підходи, які дає ядро WordPress.
Коротко: класичні 4 варіанти — це стандартний loop, query_posts(), WP_Query і get_posts(). Але сьогодні до практичних способів обов’язково варто додати ще pre_get_posts для зміни головного запиту та rewind_posts() для повторного проходу по тих самих результатах.
Як loop працює всередині WordPress
Коли користувач відкриває сторінку сайту, WordPress спочатку розбирає URL і формує набір query vars, після чого створює головний запит. На рівні ядра це зводиться до об’єкта WP_Query, який отримує записи з бази даних і зберігає їх у собі. Зазвичай основні дані приходять із таблиці wp_posts, а якщо у запиті є фільтрація за таксономіями, мета-полями чи статусами, підключаються також wp_postmeta, таблиці термів та інші пов’язані структури.
Далі вже в шаблоні працює знайома конструкція have_posts() + the_post(). Перша перевіряє, чи є ще записи для показу, а друга переводить внутрішній покажчик на наступний пост і готує глобальні дані так, щоб шаблонні теги на кшталт the_title(), the_content(), the_permalink() або the_post_thumbnail() знали, з яким саме записом вони зараз працюють.
У найпростішому вигляді стандартний loop виглядає так:
>
Записів не знайдено.
Це і є головний стандартний цикл. Він ідеально підходить для архівів, блогу, категорій, тегів, пошуку та інших місць, де WordPress уже сам сформував правильний main query. Якщо шаблон простий, цього часто більш ніж достатньо.
1. Стандартний цикл — найкращий старт і найчастіший правильний вибір
У багатьох темах узагалі не потрібно вигадувати додаткових запитів. Якщо ви працюєте з index.php, home.php, archive.php, category.php, tag.php або search.php, WordPress уже передає у шаблон готовий головний запит. Ваше завдання — лише коректно його вивести.
Плюс такого підходу в тому, що ви не ламаєте пагінацію, не дублюєте логіку ядра й не створюєте зайвих SQL-запитів. Усе вже готово, лишається тільки правильно розставити розмітку та template tags.
2. Цикл через query_posts() — історичний спосіб, але сьогодні небажаний
Свого часу query_posts() використовували дуже часто, тому що ця функція дозволяла швидко «переписати» головний цикл прямо всередині шаблону. Наприклад, змінити кількість записів, виключити категорії або відсортувати матеріали інакше. Але проблема в тому, що query_posts() не створює окремий безпечний secondary loop, а підміняє головний запит.
Технічно це працює, але на практиці легко отримати проблеми з пагінацією, умовними тегами, продуктивністю або передбачуваністю шаблону. Саме тому в сучасній розробці query_posts() краще не використовувати, якщо це не якийсь дуже специфічний legacy-випадок. Для зміни головного запиту краще є інший шлях, про який поговоримо нижче.
Практична порада: якщо бачиш у старій темі query_posts(), це не означає, що все треба терміново переписувати. Але в новому коді краще одразу обирати pre_get_posts або окремий WP_Query.
3. Цикл через WP_Query — головний інструмент для кастомних і додаткових вибірок
Клас WP_Query — це вже нормальний, гнучкий і передбачуваний спосіб створити окремий цикл. Він не ламає main query, а дає вам власний об’єкт запиту. Саме тому це найкращий варіант, коли треба вивести кілька різних блоків на одній сторінці: популярні записи, новини певної рубрики, товари, кейси, FAQ, схожі матеріали та будь-які кастомні post type.
>
Тут важливо не забути про wp_reset_postdata(). Під час кастомного циклу WordPress підміняє глобальний контекст поточного поста. Якщо після блоку з новинами ви хочете далі в шаблоні використовувати головний пост або інший loop, то глобальні дані треба повернути назад. Це особливо важливо в single-шаблонах, де після secondary query ви ще виводите контент основної сторінки чи запису.
4. Цикл через get_posts() — простий спосіб отримати невеликий список постів
Функція get_posts() подобається багатьом своєю лаконічністю. Вона повертає масив постів, а далі ви проходите його через foreach. Це хороший варіант для компактних блоків типу «останні 5 новин», «ще по темі», «схожі записи» або «вибрані статті в сайдбарі».
Головний плюс get_posts() — компактність. Головний мінус — він менш виразний, коли логіка стає складнішою. Якщо потрібна повноцінна пагінація, складні умови, мета-запити або кілька взаємопов’язаних custom loops, краще одразу брати WP_Query.
5. Додатковий сучасний спосіб: pre_get_posts для зміни головного циклу
Ось це той спосіб, який реально варто додати до класичних «чотирьох». Якщо вам потрібно змінити саме головний запит сторінки — наприклад, на блозі показувати не 10 записів, а 12, приховати певні рубрики або змінити сортування архіву — не треба чіпати query_posts(). Набагато правильніше використати хук pre_get_posts.
Це не новий спосіб зробити окремий custom loop, але дуже корисний патерн, про який часто забувають. Він економить запити і дозволяє красиво побудувати складний шаблон на тих самих даних.
Що обирати на практиці
| Задача |
Що краще використати |
| Вивести головний архів або блог |
Стандартний loop |
| Змінити головний запит сторінки |
pre_get_posts |
| Створити додатковий блок записів |
WP_Query |
| Вивести короткий список постів у віджеті чи сайдбарі |
get_posts() |
| Повторно пройти ті самі результати |
rewind_posts() |
| Legacy-код зі старих тем |
query_posts() лише з розумінням ризиків |
Підсумок
Історично про loop у WordPress справді часто говорять як про «4 способи»: стандартний цикл, query_posts(), WP_Query і get_posts(). Але якщо дивитися очима сучасної розробки, картина ширша. Для головного циклу найкраще покладатися на стандартний loop або змінювати його через pre_get_posts. Для додаткових блоків майже завжди найкращим рішенням буде WP_Query. Для простих списків зручно використовувати get_posts(). А для повторного виводу тих самих результатів чудово підходить rewind_posts().
Найважливіший висновок простий: не кожен спосіб однаково хороший сьогодні. Те, що колись вважалося нормою, як-от query_posts(), зараз скоріше належить до спадщини старих тем. Якщо хочеш писати акуратний і передбачуваний WordPress-код, тримайся ближче до WP_Query, pre_get_posts і стандартного main loop.