У цій частині серії статей, присвячених класу WP_Query, ми хочемо навчити вас використовувати WP_Query для створення запитів до записів, сторінок і довільним типами посад.

Освіжимо пам’ять щодо роботи аргументів у WP_Query

Коли ви використовуєте WP_Query в своїх темах оформлення або плагінах, доводиться включати код чотири основних елемента:

  • Аргументи для запиту, в яких використовуються параметри, з якими ми познайомимося в сьогоднішній статті;
  • Сам запит;
  • Цикл;
  • Завершальний етап: закриття всіх тегів if та else, а також скидання даних запису.

На практиці це виглядає наступним чином:

have_posts() ) {
// початок циклу обробки даних з результатів запиту
while ( $query->have_posts() ) {
$query->the_post();
// вміст опитуваної запису
}
}
// відновлення вихідних даних запису
wp_reset_postdata();
?>

Аргументи повідомляють WordPress, які дані потрібно отримувати з бази даних, і про них ми сьогодні поговоримо. Давайте зосередимо увагу на самому початку коду:

$args = array(
// Аргументи для вашого запиту
);

Як видно, аргументи укладені в масив.

Створюємо код для аргументів

Є особливий спосіб завдання аргументів в масиві:

$args = array(
‘parameter1’ => ‘value’,
‘parameter2’ => ‘value’,
‘parameter3’ => ‘value’
);

Потрібно укладати параметри та їх значення в одинарні лапки, а також використовувати => між ними. Аргументи і значення розділяються між собою комами. Якщо тут щось зробити неправильно, то WordPress може опитати не всі наведені вами аргументи, або взагалі нічого не виведеться на екран.

Опитуємо окремі записи або сторінки

Почнемо з виконання запиту для пошуку запису або сторінки.

Запит окремого запису

Щоб знайти певний запис (або набір схожих записів), потрібно використовувати два параметра:

  • p (int): ID запису;
  • name (string): за slug запису.

Ці параметри можна використовувати з будь-якими типами записів, включаючи пости, сторінки, вкладення і довільні типи записів. За замовчуванням WordPress запитує тип записів ‘post‘, і не повертає сторінки або довільні типи записів. Якщо вам потрібні саме вони, то доведеться додати більше аргументів або використовувати інші.

Про них ми розповімо вам трохи пізніше. Щоб отримати певну запис, вам потрібно скористатися одним з нижченаведених способів:

$args = array(
‘p’ => ’32’
);
або
$args = array(
‘name’ => ‘post_slug’
);

Зверніть увагу на те, що параметр name в якості аргументу використовує коротке ім’я запису, а не її заголовок.

Параметр name дозволяє визначити, що ваш запит витягне з бази даних, коли ви наступного разу зверніться до коду. Але запит не спрацює, якщо змінити значення slug запису. ID не може бути змінений, тому цей варіант надійніше.

Запит окремої сторінки

Щоб здійснити запит для окремої сторінки, використовуються ті ж два аргументи:

  • page_id (int): використовує ID сторінки;
  • pagename (string): використовує slug сторінки.

Щоб виконати запит, який буде отримувати з бази даних лише одну певну сторінку, ви можете використовувати один з наступних методів:

$args = array(
‘page_id’ => ’20’
);

або

$args = array(
‘pagename’ => ‘page_slug’
);

Запит запису іншого типу

Щоб запустити запит запису іншого типу (включаючи довільні типи), потрібно використовувати аргумент post_type:

$args = array(
‘p’ => ’46’,
‘post_type’ => ‘product’
);

Або створити запит до вкладання:

$args = array(
‘p’ => ’46’,
‘post_type’ => ‘attachment’
);

Запрошуємо всі дочірні сторінки

Іноді потрібно отримати всі дочірні елементи вибраної сторінки. Наприклад, якщо у вашого сайту сторінки мають певну ієрархію, і вам потрібно відобразити список на кожній з дочірніх сторінок.

Примітка: не можна проробити те ж саме з записами, так як вони не мають ієрархії, але можна використовувати цей підхід до довільного типу записів, якщо він має ієрархічну структуру побудови.

Є три аргументи, які можна використовувати:

  • post_parent (int): використовуємо ID сторінки для отримання тільки дочірніх сторінок. Встановіть цей параметр на 0, якщо потрібно отримати записи тільки верхнього рівня;
  • post_parent__in (array): використовуємо масив з ID записів;
  • post_parent__not_in (array): використовуємо масив з ID записів.

post_parent дозволяє виконувати запити до дочірнім сторінкам.

Для пошуку дочірніх сторінок можна використовувати наступний код:

$args = array(
‘post_type’ => ‘page’,
‘post_parent’ => ‘2’
);

Врахуйте, що вам потрібно буде включити аргумент post_type в якості стандартного типу запису, в якому WP_Query буде шукати записи.

Також це аргумент можна використовувати для пошуку дочірніх сторінок поточної сторінки:

$current_page_id = get_the_ID();
$args = array(
‘post_type’ => ‘page’,
‘post_parent’ => $current_page_id
);

Ви можете використовувати цей параметр для визначення сторінок верхнього рівня, тобто тих, у яких відсутні батьківські сторінки:

$args = array(
‘post_type’ => ‘page’,
‘post_parent’ => ‘0’
);

Але що, якщо вам потрібно визначити дочірні сторінки декількох сторінок? Для цього потрібно використовувати параметр post_parent__in. Він приймає масив з ID записів.

Щоб виконати запит для отримання дочірніх елементів двох сторінок, потрібно використовувати наступний код:

$args = array(
‘post_type’ => ‘page’,
‘post_parent__in’ => array(
‘2’,
‘4’
)
);

Із запиту також можливо виключити дочірні сторінки, якщо скористатися параметром post_parent__not_in:

$args = array(
‘post_type’ => ‘page’,
‘post_parent__not_in’ => array(
‘2’,
‘4’
)
);

Запити до кількох записів

Для включення або виключення кількох записів, можна скористатися двома аргументами:

  • post__in (array): використовуємо ID записів;
  • post__not_in (array): використовуємо ID записів.

Аргумент post__in можна використовувати для всіх типів записів, і він також приймає масиви з ID. Щоб вивести список певних записів, можна використати наступний код:

$args = array(
‘post__in’ => array(
’36’,
’52’,
‘246’,
‘354’
)
);

Примітка: якщо ви використовуєте цей аргумент для вилучення записів, WordPress буде як і раніше отримувати прикріплені запису, навіть якщо їх немає у вашому списку. Щоб виключити їх, потрібно використовувати аргумент ignore_sticky_posts:

$args = array(
‘post__in’ => array(
’36’,
’52’,
‘246’,
‘354’
),
‘ignore_sticky_posts’ => ‘true’
);

Аргумент post__not_in працює приблизно також: приймає масив ID записів, але при цьому виводить всі, за винятком перерахованих записів.

Його зазвичай комбінують з іншими аргументами, щоб уникнути виведення величезних списків записів.

Щоб зробити запит до всіх записів типу product, але при цьому виключити лише деякі, потрібно використовувати наступний код:

$args = array(
‘post_type’ => ‘product’,
‘post__not_in’ => array(
’36’,
’52’,
‘246’,
‘354’
)
);

Щоб створити запит до всіх сторінок верхнього рівня, за винятком поточної, знадобиться наступний код:

$current_page_ids = array( get_the_ID() );
$args = array(
‘post_parent’ => ‘0’,
‘post__not_in’ => $current_page_ids
);

Зверніть увагу, що якщо ви зареєстрували иерархичный тип запису, то в коді потрібно буде використовувати параметр post_type.

Робимо запит за типами запису

У деяких з прикладів я використовував параметр post_type для того, щоб визначити запису певного типу. Давайте розглянемо аргументи, які ви можете використовувати з цим параметром:

  • post: запис;
  • page: сторінка;
  • revision: змінена версія;
  • attachment: вкладення;
  • nav_menu_item: пункт меню навігації;
  • any: отримує будь-який тип, за винятком змінених версій і типів з установленим значенням true для параметра ‘exclude_from_search‘ при їх реєстрації;
  • Довільні типи записів (наприклад, product).

Як зазначено вище, ви можете використовувати цей параметр з іншими аргументами, щоб зробити ваш запит більш конкретним.

Приклад, як зробити запит до всіх сторінок вашого сайту:

$args = array(
‘post_type’ => ‘page’
);

Довільні типи записів

Робити запити до довільних типів записів досить просто: використовуйте назва типу запису, який ви вказували при реєстрації цього типу (не заголовок панелі адміністрування). Припустимо, ви зареєстрували новий тип запису product за допомогою register_post_type() наступним чином:

function register_product() {
$args = array(
‘name’ => __( ‘Products’, ‘tutsplus’ ),
‘singular_name’ => __( ‘Product’, ‘tutsplus’ )
);
register_post_type( ‘product’, $args );
}

Значення, яке ви використовуєте для аргументу post_type, коли робите запит до products, повинно бути не ‘Product‘ або ‘Products‘, а ‘product‘:

$args = array(
‘post_type’ => ‘product’
);

Вкладення

Якщо ви спробуєте виконати запит до вкладення, то у вас нічого не вийде, так як WordPress встановлює параметр вкладень post_status на inherit, і налаштування за замовчуванням у WP_Query на ‘post_status’ => ‘publish’. Якщо вам потрібно зробити запит до вкладень, то в код потрібно включити аргумент post_status:

$args = array(
‘post_type’ => ‘attachment’,
‘post_status’ => ‘inherit’
);

Можна використовувати будь-яке значення замість inherit.

На завершення

Я досить часто використовую WP_Query для створення власних запитів до записів або типів записів. За допомогою цього класу і його аргументів можна:

  • Виконувати запити до сторінок верхнього рівня на сайті;
  • Виконувати запити до записів певного типу;
  • Виконувати запити до всіх записів, за винятком зазначених;
  • Виконувати запити до всіх дочірніх сторінок поточної сторінки.

Існує ще багато варіантів використання перерахованих аргументів. У цій статті описані лише їх основні можливості.

Переклад статті «WP_Query Arguments: Posts, Pages and Post Types» був підготовлений дружною командою проекту Сайтостроение від А до Я.