В сьогоднішній 10-й, заключній, частині серії уроків по запитам WP_Query у ВордПрес ми нарешті закріпимо отримані теоретичні знання на практиці, та розглянемо 10 найбільш корисних прикладів. Це буде десять різних сценаріїв використання класу WP_Query
, а також пов’язаних з ним функцій. Сподіваюся, що вони будуть корисними для вас!
Даний прийом дуже популярний на блогах, — він дозволяє краще залучати відвідувачів сайтів. Коли вони прочитали певну публікацію, при зацікавленості до теми, вони б могли продовжити читання «споріднених за темою», тобто схожих (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(); ?>
Коли ми хочемо отримати всі дочірні сторінки до поточної (типу перелік підсторінок), ось як міг би виглядати подібний запит:
<?php $current_page_id = get_the_ID(); // отримуємо ID поточної сторінки // встановлюємо потрібні аргументи для запиту $args = array( 'parent' => $current_page_id, // отримуємо дочірні сторінки для поточної 'nopaging' => true // отримати всі наявні сторінки і не розбивати їх на окремі (без пагінації) ); // створюємо новий екземпляр класу для нашого кастомного запиту $my_query = new WP_Query( $args ); // ... і далі по звичній схемі опрацьовуємо цикл // ... ?>
Припустімо, ви хочете створити під кожним дописом перелік останніх публікацій з категорії, до якої входить поточний допис. І, звісно, що потрібно виключити поточний допис. Для цього запиту нам знадобляться лише параметри 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 ); // ... і далі по звичній схемі опрацьовуємо цикл // ... ?>
Це схожий, але реалізований дещо по-іншому, до першого практичного прикладу. Тобто, одну і ту саму задачу можна вирішувати по-різному.
CMS WordPress не має вбудованої системи підрахунку переглядів публікацій, для цього потрібні окремі плагіни (функції). Але це може сповільнювати роботу сайту, оскільки під час кожного перегляду публікації даний функціонал буде взаємодіяти із базою даних (запис/читання кількості переглядів). Однак дане завдання можна вирішити іншою реалізацією: на основі кількості коментарів. Чим більше коментарів — тим більш популярною видається публікація. А кількість коментарів вже записана до бази даних — тому з класом WP_Query
ми можемо надзвичайно легко це задіяти:
<?php $args = array( 'orderby' => 'comment_count' // сортування отриманих дописів за кількістю коментарів ); // створюємо новий екземпляр класу для нашого кастомного запиту $my_query = new WP_Query( $args ); // ... і далі по звичній схемі опрацьовуємо цикл // ... ?>
Як бачите, це доволі легке та просте рішення. Ви ж можете трішки ускладнити його і, наприклад, створити кастомний шаблон сторінки під найбільш коментовані публікації. Або щось типу того.
Скажімо, ви хочете зробити перелік дописів певного автора, і що були опубліковані в поточному році. Для цього нам потрібно лише два параметри 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(); ?>
Якщо ви подивитися на сучасні шаблони сайтів на 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()
. Але це питання не є темою даного уроку, тому деталі я опущу.
Якщо ви захоплюєтеся мудрими висловлюваннями відомих людей, ви б могли їх показувати у бічній панелі — сайдбарі. Так, як і в попередньому прикладі, — на вашому сайті повинен бути зареєстрований окремий тип публікацій, наприклад, під назвою “quotes
“, під потреби даного функціоналу. Отже, щоб показувати цитати у сайдбарі, та ще й у випадковому порядку, скористайтеся наведеним нижче фрагментом коду в якості прикладу:
<?php // встановлюємо потрібні аргументи для запиту $args = array( 'post_type' => 'quotes', // нам потрібні пости окремого типу — quotes (цитати) 'orderby' => 'rand', // умова функціоналу — рандомне сортування 'posts_per_page' => 1, // будемо показувати лише одну цитату за один раз (за одне відвідування сторінки) ); // створюємо новий екземпляр класу для нашого кастомного запиту $my_query = new WP_Query( $args ); // ... і далі по звичній схемі опрацьовуємо цикл // ... ?>
Просте та елегантне рішення.
Це вже трохи складніший приклад застосування класу 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 ); // ... і далі по звичній схемі опрацьовуємо цикл // ... ?>
Ось є така ідея: чому б не показувати відвідувачам вашого сайту анонси своїх майбутніх публікацій? Для цього ви можете скористатися наступним зразком коду:
<?php // встановлюємо потрібні аргументи для запиту $args = array( 'post_status' => 'future', // нам потрібні публікації, що мають статус запланованих (future) 'nopaging' => true // це не обов'язково, але не розбивати результати на сторінки ); // створюємо новий екземпляр класу для нашого кастомного запиту $my_query = new WP_Query( $args ); // ... і далі по звичній схемі опрацьовуємо цикл // ... ?>
Як бачите, все дуже просто! Фактично нам потрібен лише один параметр аргументів — 'post_status' => 'future'
.
І наостанок давайте виведемо всі пости, які були відзначені як приліплені. Приліплені — це означає, що таким публікаціям надано більший пріоритет серед інших. Такі пости починають відображатися найпершими на сайті (головна сторінка та при використанні другорядних запитів), але окрім сторінок категорій та тегів. Якщо «приліплених» 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.
Дякую за увагу!
Болотний екскаватор – це спеціалізована техніка, призначена для роботи в умовах підвищеної вологості, на болотистих…
Промислові системи теплопередачі потребують ефективних, надійних і економічних рішень. Одним із найбільш поширених і технологічно…
Як для людини, яка пройшла кожну з трьох оригінальних ігор серії, і на відносно слабкому…
Якщо ви закінчили школу і бажаєте присвятити себе процесу керування бізнесом (будь-якого рівня), тоді перед…
В сьогоднішній частині з серії уроків по запитам WP_Query у ВордПрес ми будемо розглядати аргументи,…