SebWeo
Клас WP_Query — це потужний інструмент, з допомогою якого можна максимально контролювати надсилання запитів до бази даних у сайтах на CMS WordPress. Він є одним із найпотужніших API, яким володіє цей популярний двигун.
Оскільки дана тема є дуже великою та об’ємною, її розгляд буде розділено на кілька окремих підтем в серії. А в сьогоднішньому уроці ми розпочнемо огляд запитів WP_Query у WordPress та проведемо вступне ознайомлення із цим інструментом.
З допомогою запиту WP_Query ми можемо вибирати потрібні нам публікації (статті, пости, сторінки тощо) по визначеним нами же критеріям (параметрам) з використовуваної двигуном WordPress бази даних. Тож цей API є надпотужним інструментом для розробника сайтів на CMS WordPress.
За замовчуванням WordPress «у фоновому режимі» вже виконує такі запити на кожній поточній сторінці, — з урахуванням використовуваного типу публікації та/або її ієрархії. До прикладу, якщо переглядається статична сторінка (тип page), WordPress запускає запит для відображення сторінки з відповідним ID (ідентифікатором), а якщо переглядається архівна сторінка (категорія, теги, по даті, тощо) результатом запиту будуть всі публікації даного типу архівів.
Але якщо мені, як програмісту, не потрібен дефолтний запит, а потрібно щось більш унікальне? Наприклад, щоб вибрати з бази даних 5 останніх записів певної категорії? Коротка відповідь — це не проблема з використанням класу 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, адже це не єдиний метод і є ще чотири:
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 неможливо, але до основних способів можна віднести наступне:
attachment, тощо)
Якщо ви розробник сайтів на WordPress, клас WP_Query буде для вас як знахідка. Особливо, якщо ви використовуєте спеціальні, унікальні, кастомні запити. Але є кілька речей, про які вам слід знати, адже ніщо не ідеальне, і тут є свої підводні камені:
WP_Query. Натомість краще створити окремий файл шаблону для цього типу контенту (архіву) та використовувати змінений цикл у цьому файлі шаблону.WP_Query, щоб створити абсолютно новий запит. Краще скористатися функціоналом хуку pre_get_posts для зміни основного запиту, в поєднанні з умовними тегами, щоб точно визначити місце застосування.
Клас WP_Query — це потужний і надзвичайно корисний інструмент, що вбудований у двигун ВордПрес. Отже, вам не потрібно видумувати свій код, щоб мати швидкий доступ до всіх готових змінних, умовних перевірок та функцій/методів при запиті контенту з бази даних. Що є дуже зручним та надійним моментом при кодуванні сайту, особливо для створення користувацьких запитів і забезпечення того, щоб сайт працював саме так, як ви того хочете.
В подальших уроках ми більш детально та глибше зануримося в дану проблематику, щоб ви мали змогу використовувати потужність запитів WP_Query на максимальному рівні.
WordPress роками був неперевершеним "монолітом": він відповідав і за зручну адмін-панель, і за збереження даних,…
У світі веб-серверів часто говорять про протистояння Nginx vs Apache. Але що, якби я сказав…
Коли я починав свій шлях у веб-розробці, питання "який веб-сервер використовувати?" практично не стояло. Відповідь…
Коли мова заходить про веб-сервери, два імені завжди на слуху: Apache та Nginx. Apache —…
У світі веб-розробки ми постійно стикаємося з проблемою: "А в мене на комп'ютері все працює!".…
На зорі моєї кар'єри веб-розробника все було відносно просто: встановив локальний сервер (пам'ятаєте Denwer?), поклав…