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

Така комбінація може знадобитися у наступних ситуаціях:

  • На сторінці категорії або таксономії, для відображення записів одного типу;
  • Для відображення записів з поточної рубрики і іншої категорії, тега або таксономії;
  • Для відображення записів тільки з певними мета-даними.

Визначаємо змінну на основі основного запиту

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

Це потрібно зробити до визначення аргументів WP_Query:

$mainquery = get_queried_object();

Функція get_queried_object() повертає поточний опитуваний об’єкт. У випадку з окремими записами, вона буде повертати об’єкт запису, а при роботі з архівами – об’єкти категорії, тега, термінів, пов’язаних з архівом. Вона повертає ID опитуваного об’єкта.

Ви можете використовувати цю змінну $mainquery у своїх аргументах WP_Query.

Приклад 1: виводимо запису одного типу на сторінці категорії

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

В даному випадку запит буде виглядати приблизно наступним чином:

$mainquery->slug,
‘post_type’ => ‘product’
);
// Довільний запит.
$query = new WP_Query( $args );
// Перевірка наявності результатів запиту.
if ( $query->have_posts() ) {
// Початок циклу обробки даних з результатів запиту.
while ( $query->have_posts() ) {
$query->the_post();
// вміст опитуваної запису.
}
}
// відновлення вихідних даних запису.
wp_reset_postdata();
?>

Параметр category_name як аргумент приймає slug категорії, тому необхідно після змінної додати ->slug, щоб вивести ярлик категорії.

Таким чином, ми отримаємо запит, який витягує з бази даних запису типу product з поточної категорії. Такий запит можна використовувати в шаблоні сторінки category.php.

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

Приклад 2: об’єднуємо основний запит з WP_Query і foreach для виведення декількох циклів

Наступний приклад дозволить нам вивести усі записи на сторінку поточної категорії відсортованими за типами.

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

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

$mainquery->slug,
‘post_type’ => $post_type
);
// Довільний запит.
$query = new WP_Query( $args );
// Перевірка наявності результатів запиту.
if ( $query->have_posts() ) {
// початок циклу обробки даних з результатів запиту.
while ( $query->have_posts() ) {
$query->the_post();
// вміст опитуваної запису.
}
}
// відновлення вихідних даних запису.
wp_reset_postdata();
}
?>

Тут також використовується змінна $mainquery, але при цьому додається змінна $post_types, яка зберігає в собі зареєстровані на сайті типи записів, а також $post_type для зберігання кожного окремого типу запису.

Приклад 3: два окремих запиту для двох типів записів

Останній приклад трохи схожий на попередній, але тільки розділяє типи записів на два окремих запиту, в кожному з яких буде свій унікальний цикл. Таким чином, можна контролювати, що слід відображати у кожному з циклів. Завдяки цьому можна не тільки вивести записи типу product, але і оформити їх мініатюрою або задати їм інший тип розмітки.

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

Цього можна домогтися за допомогою наступного коду:

$mainquery->slug,
‘post_type’ => ‘post’,
‘posts_per_page’ => ’10’
);
// Довільний запит.
$query = new WP_Query( $args );
// Перевірка наявності результатів запиту.
if ( $query->have_posts() ) {
// початок циклу обробки даних з результатів запиту.
while ( $query->have_posts() ) {
$query->the_post();
// вміст опитуваної запису.
}
}
// відновлення вихідних даних запису.
wp_reset_postdata();
// Аргументи другого запиту для товарів.
$args = array (
‘category_name’ => $mainquery->slug,
‘post_type’ => ‘product’,
‘posts_per_page’ => ‘-1’
);
// Довільний запит.
$query = new WP_Query( $args );
// Перевірка наявності результатів запиту.
if ( $query->have_posts() ) {
// початок циклу обробки даних з результатів запиту.
while ( $query->have_posts() ) {
$query->the_post();
// вміст опитуваної запису.
}
}
// відновлення вихідних даних запису.
wp_reset_postdata();
?>

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

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

Наведені приклади можна реалізувати і для інших типів архівів: таксономій, авторів, дат і т. д. Можливо, ви придумаєте що-небудь інше, але тоді не забудьте розповісти про це в коментарях!

Переклад статті «Combining WP_Query With the Main Query» був підготовлений дружною командою проекту Сайтостроение від А до Я.