За замовчуванням 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» був підготовлений дружною командою проекту Сайтостроение від А до Я.