Використання запитів WP_Query у WordPress в теорії та на прикладах — частина 1 (вступ)
Клас WP_Query — це потужний інструмент, з допомогою якого можна максимально контролювати надсилання запитів до бази даних у сайтах на CMS WordPress. Він є одним із найпотужніших API, яким володіє цей популярний двигун.
Оскільки дана тема є дуже великою та об’ємною, її розгляд буде розділено на кілька окремих підтем в серії. А в сьогоднішньому уроці ми розпочнемо огляд запитів WP_Query
у WordPress та проведемо вступне ознайомлення із цим інструментом.
Початок освоєння запитів WP_Query у ВордПрес
З допомогою запиту WP_Query
ми можемо вибирати потрібні нам публікації (статті, пости, сторінки тощо) по визначеним нами же критеріям (параметрам) з використовуваної двигуном WordPress бази даних. Тож цей API є надпотужним інструментом для розробника сайтів на CMS WordPress.
За замовчуванням WordPress «у фоновому режимі» вже виконує такі запити на кожній поточній сторінці, — з урахуванням використовуваного типу публікації та/або її ієрархії. До прикладу, якщо переглядається статична сторінка (тип page
), WordPress запускає запит для відображення сторінки з відповідним ID (ідентифікатором), а якщо переглядається архівна сторінка (категорія, теги, по даті, тощо) результатом запиту будуть всі публікації даного типу архівів.
Але якщо мені, як програмісту, не потрібен дефолтний запит, а потрібно щось більш унікальне? Наприклад, щоб вибрати з бази даних 5 останніх записів певної категорії? Коротка відповідь — це не проблема з використанням класу WP_Query
та його величезною кількістю параметрів! З його допомогою ви можете показувати саме той контент, який вам потрібен!
Тож, давайте приступимо до вивчення цієї складної теми та поглянемо на всі тонкощі використання WP_Query
.
Що таке WP_Query?
WP_Query — це клас, вбудований у двигун WordPress. А це означає, що вам не потрібно писати свій клас, адже у вас вже є швидкий доступ до всіх готових змінних, умовних перевірок та функцій/методів. Що є дуже зручним та надійним моментом при кодуванні сайту.
Клас WP_Query
складається з чотирьох основних компонентів:
- аргументи для запиту з використанням параметрів
- безпосередньо сам запит
- робота з результуючим циклом (заголовки, дати, контент, тощо)
- завершення запиту і скидання даних публікації (глобального
$post
)
На практиці орієнтовний вигляд запиту може мати приблизно такий вигляд:
<?php $args = array( // масив аргументів запиту ); // зразок користувацького запиту // створення нового екземпляру класу – нового об’єкту $query = new WP_Query( $args ); // перевірка на наявність результатів запиту if ( $query->have_posts() ) { // проходження циклом по результатам запиту while ( $query->have_posts() ) { $query->the_post(); // тут контент публікації результату } } // обов'язкове відновлення (скидання) оригінальних даних публікації після запиту // перезавантаження глобальної змінної $post wp_reset_postdata(); ?>
ВАЖЛИВО: відновлення (скидання) даних публікації після запиту
В кінці наведеного вище прикладу ви можете бачити рядок wp_reset_postdata();
— це дуже важливо, оскільки запит повинен повертатися до свого початкового стану (основного запиту, що виконується на цій сторінці). Ця умова виникає внаслідок того, що на одній сторінці може бути безліч запитів, — і тому вони можуть конфліктувати, а ви отримаєте зовсім не ті результати, на які очікували.
Навіщо використовувати WP_Query, якщо є інші методи?
Якщо ви раніше не користувалися класом WP_Query
, можливо, вас потрібно буде переконувати в доцільності його використання? Оскільки є інші методи, навіщо використовувати саме цей вид запиту? Давайте розберемося у цьому питанні.
Щоб створити власний запит до бази даних, у вашому розпорядженні є не лише WP_Query
, адже це не єдиний метод і є ще чотири:
pre_get_posts
— дуже ефективний хук, якщо вам потрібно змінити (модифікувати) основний запит. Повинен бути на самому початку вашого запиту. Не можна використати для створення абсолютно нового запиту.get_posts()
— цей тег у шаблонах фактично використовує класWP_Query
, але є проміжною додатковою ланкою, щоб робити запит постів.get_pages()
— також, як і попередній тег, додатково викликає класWP_Query
для запиту сторінок замість того, щоб робити це напряму.query_posts()
— змінює основний запит, відкидаючи його і починаючи запит з початку (що може негативно впливати на час завантаження сторінки). При необхідності в зміні основного запиту, краще використовувати замість ньогоpre_get_posts
. А якщо є потреба в повністю новому запиті, — тоді найкраще використовувати безпосередньоWP_Query
.
Отже, як ви можете бачити, всі розглянуті методи є тим чи іншим видом використання класу WP_Query
, тож чому б не робити це напряму, без допоміжних ланок?
Нижче ви можете графічно представити собі роботу класу WP_Query
щодо запиту до бази даних. Дана інфографіка навіяна працею Андрія «Rarst» Савченка.
Схематична робота функцій запитів до бази даних у CMS WordPress:
Коли використовувати WP_Query?
Перелічити всі варіанти використання WP_Query
неможливо, але до основних способів можна віднести наступне:
- для більш налаштовуваного переліку останніх дописів в сайдбарі (чи футері), на відміну від тематичного віджету «Останні публікації»
- якщо вам потрібно навести список пов’язаних публікацій під поточною публікацією (наприклад, з тієї самої категорії)
- якщо вам потрібно використовувати більше ніж один запит на сторінці (наприклад, окремі списки постів вгорі та внизу сайту, в сайдбарі, тощо)
- якщо вам потрібно створити спеціальні запити з використанням кількох таксономій (категорії, теги, меню, тощо)
- якщо дефолтний запит вас не задовольняє (наприклад, якщо вам потрібні специфічні типи публікацій, як от вкладення —
attachment
, тощо)
Потенційні підводні камені, деякі застереження, про що слід знати
Якщо ви розробник сайтів на WordPress, клас WP_Query
буде для вас як знахідка. Особливо, якщо ви використовуєте спеціальні, унікальні, кастомні запити. Але є кілька речей, про які вам слід знати, адже ніщо не ідеальне, і тут є свої підводні камені:
- Якщо вам потрібно лише змінити візуальну складову відображення публікацій певного типу, не використовуйте
WP_Query
. Натомість краще створити окремий файл шаблону для цього типу контенту (архіву) та використовувати змінений цикл у цьому файлі шаблону. - Якщо вам потрібно лише трохи модифікувати запит (наприклад, показувати іншу кількість дописів на архівній сторінці, чи не показувати певну категорію), не використовуйте для цього
WP_Query
, щоб створити абсолютно новий запит. Краще скористатися функціоналом хукуpre_get_posts
для зміни основного запиту, в поєднанні з умовними тегами, щоб точно визначити місце застосування. - Хоча ви можете створити на сторінці з десяток різних запитів, краще такого уникати. Адже це негативно відобразиться на сервері та підключенні до бази даних. При необхідності в більше ніж п’яти запитах на сторінці, можливо кращим варіантом буде створення додаткових окремих сторінок для цього.
Замість короткого висновку
Клас WP_Query
— це потужний і надзвичайно корисний інструмент, що вбудований у двигун ВордПрес. Отже, вам не потрібно видумувати свій код, щоб мати швидкий доступ до всіх готових змінних, умовних перевірок та функцій/методів при запиті контенту з бази даних. Що є дуже зручним та надійним моментом при кодуванні сайту, особливо для створення користувацьких запитів і забезпечення того, щоб сайт працював саме так, як ви того хочете.
В подальших уроках ми більш детально та глибше зануримося в дану проблематику, щоб ви мали змогу використовувати потужність запитів WP_Query
на максимальному рівні.