Використання запитів WP_Query у WordPress — 10 практик застосування

В сьогоднішній 10-й, заключній, частині серії уроків по запитам WP_Query у ВордПрес ми нарешті закріпимо отримані теоретичні знання на практиці, та розглянемо 10 найбільш корисних прикладів. Це буде десять різних сценаріїв використання класу WP_Query, а також пов’язаних з ним функцій. Сподіваюся, що вони будуть корисними для вас!

 

10 практичних прикладів застосування WP_Query у WordPress

 

Практичний приклад №1: вивести схожі пости, з тієї самої категорії

Даний прийом дуже популярний на блогах, — він дозволяє краще залучати відвідувачів сайтів. Коли вони прочитали певну публікацію, при зацікавленості до теми, вони б могли продовжити читання «споріднених за темою», тобто схожих (related), публікацій. Ось як можна це зробити, обираючи схожі пости за спільною з поточним постом категорією:

<?php
// отримуємо ID всіх категорій, до яких належить поточний пост
$cats = wp_get_object_terms( $post->ID, 'category', array( 'fields' => 'ids' ) );
// встановлюємо потрібні аргументи для запиту
$args = array(
  'posts_per_page' => 10, // кількість схожих публікацій для запиту
  'tax_query' => array(
    array(
      'taxonomy' => 'category', // вказуємо, що нам потрібні пости споріднені по категорії
      'field' => 'id', // обирати по полю ID
      'terms' => $cats, // значення ID-шок
      'include_children' => false, // не включаємо пости від дочірніх категорій
      'operator' => 'IN' // якщо пост належить хоча б одній категорії до поточного посту
    )
  )
);
// створюємо новий екземпляр класу для нашого кастомного запиту
$my_query = new WP_Query( $args );
// ... і далі по звичній схемі опрацьовуємо цикл
if ($my_query->have_posts()) {
  echo '<h3>Схожі пости з даної категорії</h3>';
  while ($my_query->have_posts()) : $my_query->the_post();
    echo '<p><a href="' . get_permalink($my_query->post->ID) . '">' . $my_query->post->post_title . '</a></p>';
  endwhile;
}
wp_reset_postdata();
?>

 

Практичний приклад №2: вибірка дочірніх сторінок до поточної

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

<?php
$current_page_id = get_the_ID(); // отримуємо ID поточної сторінки
// встановлюємо потрібні аргументи для запиту
$args = array(
  'parent' => $current_page_id, // отримуємо дочірні сторінки для поточної
  'nopaging' => true // отримати всі наявні сторінки і не розбивати їх на окремі (без пагінації)
);
// створюємо новий екземпляр класу для нашого кастомного запиту
$my_query = new WP_Query( $args );
// ... і далі по звичній схемі опрацьовуємо цикл
// ...
?>

 

Практичний приклад №3: останні публікації з цієї категорії (крім поточної публікації)

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

<?php
$current_post_id = get_the_ID(); // отримуємо ID поточного допису
$current_post_cats = get_the_category(); // отримуємо категорію поточного допису (якщо більше однієї — першу)
$current_post_first_cat_id = $current_post_cats[0]->term_id;
// встановлюємо потрібні аргументи для запиту
$args = array(
  'cat' => $current_post_first_cat_id, // запит базується на аргументі категорій
  'post__not_in' => array( $current_post_id ) // виключити із запиту поточний допис
);
// створюємо новий екземпляр класу для нашого кастомного запиту
$my_query = new WP_Query( $args );
// ... і далі по звичній схемі опрацьовуємо цикл
// ...
?>

Це схожий, але реалізований дещо по-іншому, до першого практичного прикладу. Тобто, одну і ту саму задачу можна вирішувати по-різному.

 

Практичний приклад №4: найпопулярніші публікації (по кількості коментарів)

CMS WordPress не має вбудованої системи підрахунку переглядів публікацій, для цього потрібні окремі плагіни (функції). Але це може сповільнювати роботу сайту, оскільки під час кожного перегляду публікації даний функціонал буде взаємодіяти із базою даних (запис/читання кількості переглядів). Однак дане завдання можна вирішити іншою реалізацією: на основі кількості коментарів. Чим більше коментарів — тим більш популярною видається публікація. А кількість коментарів вже записана до бази даних — тому з класом WP_Query ми можемо надзвичайно легко це задіяти:

<?php
$args = array(
  'orderby' => 'comment_count' // сортування отриманих дописів за кількістю коментарів
);
// створюємо новий екземпляр класу для нашого кастомного запиту
$my_query = new WP_Query( $args );
// ... і далі по звичній схемі опрацьовуємо цикл
// ...
?>

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

 

Практичний приклад №5: вибірка усіх дописів автора поточного року

Скажімо, ви хочете зробити перелік дописів певного автора, і що були опубліковані в поточному році. Для цього нам потрібно лише два параметри WP_Query, author та year:

<?php
$current_year = date( 'Y' ); // отримуємо числове значення поточного року
// встановлюємо потрібні аргументи для запиту
$args = array(
  'author' => 'petro', // в даному прикладі ми хочемо дописи автора із найснеймом (nicename) "petro"
  'year'   => $current_year // і що були опубліковані виключно у цьому році
);
// створюємо новий екземпляр класу для нашого кастомного запиту
$my_query = new WP_Query( $args );
// ... і далі по звичній схемі опрацьовуємо цикл
// передаємо дані запиту для обробки у цикл
if ( $my_query->have_posts() ) {
  while ( $my_query->have_posts() ) {
    $my_query->the_post();
    // тут працюємо із даними одного допису
  }
}
// очищуємо дані глобального $post для основного запиту
wp_reset_postdata();
?>

 

Практичний приклад №6: просте отримання з бази даних слайдерів

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

<?php
// встановлюємо потрібні аргументи для запиту
$args = array(
  'post_type' => 'slider', // в даному випадку ми використовуємо спеціальний тип дописів — слайдер
  'category_name' => 'home-sliders', // якщо потрібні слайди зі спеціальної категорії
  'nopaging' => true // отримати всі наявні слайди і не розбивати їх на сторінки
);
// створюємо новий екземпляр класу для нашого кастомного запиту
$my_query = new WP_Query( $args );
// ... і далі по звичній схемі опрацьовуємо цикл
// ...
?>

Тут варто зазначити, що важливою умовою для цього прикладу є те, що ваш сайт повинен мати такий тип публікацій (slider) і дописи із ним. Тобто, спочатку ви б мали створити новий тип публікацій під назвою “slider” з допомогою функції register_post_type(). Але це питання не є темою даного уроку, тому деталі я опущу.

 

Практичний приклад №7: випадкова цитата в сайдбарі

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

<?php
// встановлюємо потрібні аргументи для запиту
$args = array(
  'post_type' => 'quotes', // нам потрібні пости окремого типу — quotes (цитати)
  'orderby' => 'rand', // умова функціоналу — рандомне сортування
  'posts_per_page' => 1, // будемо показувати лише одну цитату за один раз (за одне відвідування сторінки)
);
// створюємо новий екземпляр класу для нашого кастомного запиту
$my_query = new WP_Query( $args );
// ... і далі по звичній схемі опрацьовуємо цикл
// ...
?>

Просте та елегантне рішення.

 

Практичний приклад №8: витяг з бази товарів у певному діапазоні цін

Це вже трохи складніший приклад застосування класу WP_Query, аніж попередні. До того ж, тут умовою є використання на WordPress сайті функціоналу електронної комерції (наприклад, з WooCommerce). Фрагмент коду нижче буде запитувати список товарів (тип публікацій product) та фільтрувати результати за допомогою спеціальних полів (мета-даних) ціни:

<?php
// встановлюємо потрібні аргументи для запиту
$args = array(
  'post_type' => 'product', // нам потрібні пости окремого типу — "product" (товар)
  'meta_query' => array( // налаштування параметрів для запиту мета-даних
    array(
      'key' => 'price', // працюємо із мета-даними з ключем "price"
      'value' => array( 1500, 1750 ), // нам потрібні наступні значення цін
      'compare' => 'BETWEEN', // вказуємо значення оператору compare — тобто ціни повинні бути у даному проміжку
      'type' => 'numeric', // і так, нам потрібні лише числові значення
    )
  )
);
// створюємо новий екземпляр класу для нашого кастомного запиту
$my_query = new WP_Query( $args );
// ... і далі по звичній схемі опрацьовуємо цикл
// ...
?>

 

Практичний приклад №9: анонс запланованих (майбутніх) публікацій

Ось є така ідея: чому б не показувати відвідувачам вашого сайту анонси своїх майбутніх публікацій? Для цього ви можете скористатися наступним зразком коду:

<?php
// встановлюємо потрібні аргументи для запиту
$args = array(
  'post_status' => 'future', // нам потрібні публікації, що мають статус запланованих (future)
  'nopaging' => true // це не обов'язково, але не розбивати результати на сторінки
);
// створюємо новий екземпляр класу для нашого кастомного запиту
$my_query = new WP_Query( $args );
// ... і далі по звичній схемі опрацьовуємо цикл
// ...
?>

Як бачите, все дуже просто! Фактично нам потрібен лише один параметр аргументів — 'post_status' => 'future'.

 

Практичний приклад №10: запит приліплених (sticky) публікацій

І наостанок давайте виведемо всі пости, які були відзначені як приліплені. Приліплені — це означає, що таким публікаціям надано більший пріоритет серед інших. Такі пости починають відображатися найпершими на сайті (головна сторінка та при використанні другорядних запитів), але окрім сторінок категорій та тегів. Якщо «приліплених» sticky постів більше одного, — тоді вони сортуватимуться між собою по даті публікації. Ось лише такі параметри для аргументів запиту нам потрібні:

<?php
// встановлюємо потрібні аргументи для запиту
$args = array(
  'post__in'  => get_option( 'sticky_posts' ), // отримуємо масив ID-ішок всіх приліплених публікацій
  'posts_per_page' => -1, // знімаємо обмеження по кількості на сторінку, — тобто показувати всі
  'ignore_sticky_posts' => 1 // ігнорувати "підвищений" пріоритет таких постів (необов'язково)
);
// створюємо новий екземпляр класу для нашого кастомного запиту
$my_query = new WP_Query( $args );
// ... і далі по звичній схемі опрацьовуємо цикл
// ...
?>

 

 

Ось і все — серія уроків з даної теми добігла кінця. Ми розглянули 10 практичних прикладів використання класу WP_Query, коли є потреба у певних публікаціях з бази даних. Ці знання повинні дати вам більше впевненості при роботі із цією популярною CMS.

Дякую за увагу!

 

Recent Posts

Основні завдання болотного екскаватора: де і для чого він використовується

Болотний екскаватор – це спеціалізована техніка, призначена для роботи в умовах підвищеної вологості, на болотистих…

5 днів ago

Чому пластинчасті теплообмінники є оптимальним вибором для промисловості

Промислові системи теплопередачі потребують ефективних, надійних і економічних рішень. Одним із найбільш поширених і технологічно…

5 днів ago

Зигмунд Фрейд

Коли ти помер, ти про це не знаєш. Тільки іншим важко. Те саме, коли ти…

6 днів ago

Підбір ігрового ноутбука для комфортного проходження S.T.A.L.K.E.R 2

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

1 тиждень ago

Як навчитися менеджменту в Україні?

Якщо ви закінчили школу і бажаєте присвятити себе процесу керування бізнесом (будь-якого рівня), тоді перед…

1 тиждень ago

Використання запитів WP_Query у WordPress — частина 9 (аргументи для мета-даних)

В сьогоднішній частині з серії уроків по запитам WP_Query у ВордПрес ми будемо розглядати аргументи,…

2 тижні ago