За замовчуванням WordPress робить запити (query) на кожній сторінці, що відображається на сайті і запити ці відрізняються в залежності від типу сторінок. Якщо в даний момент проглядається статична сторінка, то виконується запит для відображення сторінки з відповідним ID. Але якщо користувач відкрив сторінку архіву, то буде надіслано запит на вилучення всіх записів з цього архіву.
Іноді на сторінці потрібно відобразити такий контент, який можна отримати за допомогою стандартного запиту. WordPress дозволяє нам зробити це за допомогою класу WP_Query.
Цей клас пропонує безліч параметрів, які можна використовувати для визначення того, який контент потрібно витягти (і при цьому необов’язково обмежуватися записами), а потім написати цикл для виведення потрібного нам контенту.
Сьогодні ми відкриваємо цикл статей, присвячених класу WP_Query. У вступній частині ми розповімо:
- Що таке WP_Query;
- Для чого потрібен цей клас;
- Потенційні проблеми, про які слід знати.
Що таке WP_Query?
WP_Query – це клас у WordPress, що дозволяє використовувати його для швидкого доступу до змінних і функцій ядра WordPress, без необхідності писати код вручну.
Якщо вам хочеться зрозуміти принцип роботи WP_Query, то код цього класу можна переглянути у файлі includes/query.php.
WP_Query складається з 4 основних елементів:
- Аргументи для запиту, використовують параметри, про які ми поговоримо більш детально в наступних статтях з цієї серії;
- Сам запит;
- Цикл, який виводить вміст запису, заголовки або все те, що вам потрібно вивести на екран;
- Заключна секція: тут закриваються теги if і while, а також скидаються дані записи.
На практиці це виглядає наступним чином:
have_posts() ) {
// Початок виведення результатів запиту.
while ( $query->have_posts() ) {
$query->the_post();
// Вміст отриманих результатів починається звідси.
}
}
// Відновлення вихідних даних запису.
wp_reset_postdata();
?>
Ви можете визначати власні аргументи при написанні запиту, але я віддаю перевагу вказувати їх з самого початку.
Скидаємо дані записи
У прикладі я додав wp_reset_postdata() після кожного запиту. Це важливо, так як скидає запит до вихідного стану.
Наприклад, якщо ви використовуєте WP_Query для виконання запиту в бічній панелі, то wp_reset_postdata() повідомить WordPress, що ми все ще перебуваємо на поточній сторінці, і слід працювати зі стандартним для цієї сторінки запитом.
Якщо ви цього не зробите, будь-які наступні запити, що запускаються на цій сторінці (включаючи стандартний запит), можуть не принести результату, а також не буде працювати перевірка умовних позначок.
Для чого потрібен WP_Query?
Я хочу зосередити увагу на двох аспектах: з’ясувати, чому з усіх методів створення довільних запитів варто використовувати саме WP_Query, а також розглянути сценарії, в яких він застосовується.
Чому WP_Query, а не інші доступні методи?
WP_Query – це не єдиний метод створення довільних запитів. Є ще як мінімум 4 методу:
- pre_get_posts;
- get_posts();
- get_pages();
- query_posts().
Я не хочу влазити в якісь нетрі, але вам буде корисно знати наступне:
- pre_get_posts – це хук, який змінює основний запит. Його можна використовувати з умовним тегом для перевірки на предмет перегляду певного типу сторінок (наприклад, головної сторінки), а потім використовувати його для запуску запиту, який, у свою чергу, запускає скрипт для видалення трьох останніх записів (для прикладу). Це ефективний спосіб зміни основного запиту, і його слід використовувати, якщо вам потрібно реалізувати щось подібне. Але його не можна застосовувати для створення повністю нового запиту;
- get_posts() і get_pages() — схожі, але відрізняються не тільки назвою, але і призначенням. Ці теги шаблонів також використовують клас WP_Query, так що це лише додатковий спосіб реалізації. Але при їх використанні нам доведеться робити на одну дію більше, так як вони запускають клас WP_Query, а ви можете зробити це прямо. Їх можна використовувати для створення запиту до записів або сторінок, а WP_Query є більш потужним засобом, і дозволяє витягнути з бази даних практично що завгодно;
- query_posts() змінює основний запит, але я не рекомендую вам його використовувати в плагінах або темах оформлення. Він просто викидає основний запит, замінюючи його новим. Це сприяє появі помилок, особливо в пагинации. Також він негативно позначається на швидкості завантаження сторінок. Якщо вам потрібно змінити основний запит, краще використовуйте pre_get_posts, для створення нового — WP_Query.
Ця діаграма відображає все вищесказане:
Коли нам можемо знадобитися WP_Query
Є безліч сценаріїв, коли нам може знадобитися WP_Query:
- При додаванні списку рекомендованих записів під поточним записом. Наприклад, список записів з цієї ж категорії;
- Для створення двох циклів на одній і тій же сторінці;
- Для створення довільного списку свіжих записів в бічній панелі або підвалі сторінки, коли стандартний віджет не відповідає вашим вимогам;
- При створенні довільних запитів для таксономій з використанням більше однієї таксономії для визначення того, що було відображено.;
- При запиті типу запису (post type), який неможливо отримати за допомогою стандартного запиту. Наприклад, завантажені файли;
- Для створення довільних сторінок з декількома запитами для різних типів контенту.
Деякі застереження
Що слід враховувати при використанні WP_Query:
- Якщо вам потрібно лише змінити відображення записів у рамках конкретного типу контенту або архіву, то я не рекомендую використовувати WP_Query. Замість цього краще створіть файл шаблону для цього архіву або типу вмісту, і попрацюйте над циклом в цьому файлі;
- Якщо вам потрібно показати більше або, навпаки, менше записів на сторінці архіву (наприклад, позбутися певної категорії), то не використовуйте WP_Query для створення нових запитів. Краще скористайтеся pre_get_posts для зміни основного запиту, а також умовними позначками для виведення;
- Намагайтеся не запускати декілька запитів на одній сторінці. Теоретично ви можете створити сторінку з сотнями довільних запитів, але подумайте про навантаження на сервер. Якщо вам необхідно використовувати більш 4-5 запитів на одній сторінці, то краще створити кілька сторінок.
На завершення
Клас WP_Query – багатофункціональний і зручний інструмент для створення довільних запитів. Але бувають випадки, коли краще використовувати інші методи створення користувацьких запитів.
В наступних статтях цієї серії ми дізнаємося, як правильно використовувати WP_Query, і як отримати від нього максимальну віддачу.
Переклад статті «Mastering WP_Query: An Introduction» був підготовлений дружною командою проекту Сайтостроение від А до Я.