Використання запитів 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 складається з чотирьох основних компонентів:

  1. аргументи для запиту з використанням параметрів
  2. безпосередньо сам запит
  3. робота з результуючим циклом (заголовки, дати, контент, тощо)
  4. завершення запиту і скидання даних публікації (глобального $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, адже це не єдиний метод і є ще чотири:

  1. pre_get_posts — дуже ефективний хук, якщо вам потрібно змінити (модифікувати) основний запит. Повинен бути на самому початку вашого запиту. Не можна використати для створення абсолютно нового запиту.
  2. get_posts() — цей тег у шаблонах фактично використовує клас WP_Query, але є проміжною додатковою ланкою, щоб робити запит постів.
  3. get_pages() — також, як і попередній тег, додатково викликає клас WP_Query для запиту сторінок замість того, щоб робити це напряму.
  4. 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 на максимальному рівні.

 

Recent Posts

Марк Аврелій

Твої думки стають твоїм життям Марк Аврелій  

2 дні ago

Зберігання та транспортування готової алмазної мозаїки

Алмазна мозаїка вимагає дбайливого поводження як у процесі її створення, так і після завершення роботи.…

3 дні ago

Унікальні корисні властивості насіння чіа

Насіння чіа – це маленькі зернятка, які містять у собі велику кількість корисних речовин. Вони…

5 днів ago

Христофор Колумб

Ви ніколи не перетнете океан, якщо не наберетеся мужності залишити берег позаду Христофор Колумб  

5 днів ago

Ніл Волш

Іноді ти думаєш, що хочеш зникнути, але насправді ти хочеш бути знайденим Ніл Волш  

1 тиждень ago

Гігієна ніг: що має бути у кожного?

Турбота про ноги – це не лише питання здоров'я, а й основа щоденного комфорту. Адже…

1 тиждень ago