Як створити просунутий пошук в WordPress за допомогою WP_Query

347

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

Велика частина переваг WordPress йде з його гнучкої архітектури даних, за допомогою якої розробники можуть широко налаштовувати свої системи з допомогою користувацьких типів постів, класифікацій, а також користувальницьких полів. Однак коли мова заходить про пошук в WordPress, то користувачеві надається лише одне поле, яке часто веде себе настільки неадекватно, що адміністратори завантажують зовнішні пошукові системи на зразок Google Custom Search або сторонніх плагінів.

Стаття розділена на 2 частини. У першій я розповім в теорії, як обробити запит користувача, починаючи від передачі URL, процесу виконання запиту і до виведення результату. А друга частина-це конкретне застосування отриманої теорії з першої частини, в ній ми створимо свою популярну пошукову систему. Давайте розберемо кілька ключових концепцій.

Запити користувача

Коли користувач переходить по посиланню або вбиває URL певної сторінки вручну, WordPress виконує серію операцій, добре описану в Query Overview. Якщо коротко, то відбувається наступне:

WordPress розбирає запитуваний URL на набір параметрів (які називаються специфікація запиту).

Задаються всі змінні «is_», пов’язані з запитом.

Специфікація запиту конвертується в MySQL запит, який надсилається в базу даних.

Отримані з БД дані зберігаються в об’єкті $wp_query.

Потім WP обробляє помилку 404.

Надсилаються HTTP заголовки блогу.

Ініціалізуються змінні циклу.

За правилами ієрархії вибрати шаблон.

WordPress запускає цикл.

Першим відбувається парсинг URL рядка, так що давайте розберемо рядка запиту і змінні.

Змінні WP Query: стандартні і призначені для користувача

У кодексі зазначено: «Користувачі або розробники WordPress можуть використовувати масив змінних запиту для пошуку контенту певного типу або в якості додаткового функціоналу в дизайні теми і/або плагіна.»

Іншими словами, змінні запиту WP визначають результат виконання запиту до БД. За замовчуванням в WP доступні змінні запиту типу private і public. У кодексі про таких змінних йдеться: Публічні змінні запиту це змінні, доступні безпосередньо через URL-адреси запиту з форми. example.net/?var1=value1&var2=value2

Приватні змінні можна використовувати у рядку URL. WP приймає рядок запиту з приватними змінними, але вони не пройдуть парсинг. Тому такі змінні необхідно вказувати безпосередньо у запиті. Приклад нижче.

query_posts(‘privatevar=myvalue’);

І як наслідок, через рядок запиту можна послати такі приватні змінні, як category__in category__not_in category__end тощо (в кодексі ви знайдете повний список вбудованих змінних, які можна використовувати в рядку запиту).

З допомогою публічних змінних ми (як користувачі або розробники) можемо скласти досить багато запитів, і нам не знадобиться створювати плагіни або редагувати файл теми functions.Нам потрібно всього лише створити URL, додати до рядку запиту пару доступних параметрів, і WP покаже користувачеві сторінку з результатом.

В якості прикладу з допомогою параметра post_type в рядку запиту ми можемо отримати пости певного типу; або ми можемо зробити пошук по користувальницької таксономії, додавши в кінець рядка запиту пару taxonomy-name=taxonomy-term. Наприклад, можна створити наступний URL: mywebsite.com/?post_type=movie&genre=thriller

WP звернутися до бази даних і витягне всі пости типу movie з жанром thriller, де genre – користувацька таксономія. Круто, але це не все. Дотепер ми говорили тільки про вбудованому функціоналі змінних запиту, однак WordPress так влаштована, що ми можемо створювати свої власні змінні запиту.

Як зареєструвати користувальницькі змінні запиту

Користувальницькі змінні необхідно зареєструвати перед використанням. Зробити це можна за допомогою фільтра query_vars. Давайте відкриємо головний файл плагіна (або файл теми functions.php) і пропишемо там нижче код:

/**
* Register custom query vars
*
* @link https://codex.wordpress.org/Plugin_API/Filter_Reference/query_vars
*/
function myplugin_register_query_vars( $vars ) {
$vars[] = ‘author’;
$vars[] = ‘editor’;
return $vars;
}
add_filter( ‘query_vars’, ‘myplugin_register_query_vars’ );

Колбек функція приймає масив змінних в якості аргументу і має повернути такий же масив після додавання нових змінних.

Тепер можна додати наші нові змінні параметри рядка запиту. Завдяки get_query_var() ці параметри будуть доступні в нашому скрипті, це ми побачимо трохи пізніше. А зараз настав час познайомити вас з класом, який керує запитами в WordPress.

Її величність WP_Query

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

З допомогою безлічі методів і властивостей класу отримані з БД дані потрапляють в цикл Loop. Розберемо базовий приклад з Loop:

Якщо ви ще новачок в WordPress розробці, ви можете задатися питанням: «А де, власне, сам запит?!». За фактом, вам не потрібно створювати новий екземпляр об’єкта WP_Query. Клас сам створює запит для запитаної сторінки. Так що якщо користувач захотів переглянути посади певної категорії з архіву, WP створить запит і витягне всі пости за певної категорії, а Loop покаже їх.

Але це найпростіший приклад основного запиту. Передавши в новий екземпляр класу WP_Query масив з параметрами, ми можемо розширити цей функціонал і фільтрувати результат. У наведеному нижче прикладі показано, як це зробити:

// Масив аргументів
$args = array( ‘arg_1’ => ‘val_1’, ‘arg_2’ => ‘val_2’ );
// Запит
$the_query = new WP_Query( $args );
// Loop
if ( $the_query->have_posts() ) {
while ( $the_query->have_posts() ) : $the_query->the_post();
// Ваш код
endwhile;
} else {
// посади не знайдені
}
/* Restore original Post Data */
wp_reset_postdata();

Виглядає трохи складніше, чи не так? Проте якщо розглянути код ближче, це не так. У новому об’єкті класу WP_Query зберігається масив аргументів, який впливає на те, які дані ми витягнемо з БД. У кодексі можна знайти повний список параметрів, згрупованих у 17 категорій. Наприклад, там є параметри автора, категорій, один параметр пошуку (s), параметри користувальницьких полів і т. д. (трохи пізніше ми повернемося до параметрів WP_Query).

Після створення об’єкта $query нам доступні всі його методи і властивості. Методи have_posts перевіряє, чи залишилися ще пости для висновку, а the_post пересуває Loop до наступного посту і оновлює глобальну змінну $post.

При створенні користувальницького запиту завжди необхідно поза циклу Loop викликати wp_reset_postdata(). Ця функція відновлює глобальну змінну $post після виконання запиту користувача. Це вкрай важливо, оскільки будь-який новий запит перезаписує змінну $post. З кодексу:

«Зверніть увагу: Якщо у своєму запиті ви використовуєте the_post(), після запиту вам знадобиться запустити метод wp_reset_postdata(), щоб Template Tags знову використовували основний запит поточного посади.»

Повернемося до аргументів запиту.

Аргументи WP_Query

Ми вже сказали, що в класі WP_Query зберігається масив параметрів, за допомогою яких розробники можуть вибирати, що витягнути з БД.

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

author

author_name

author__in

author__not_in

Якщо потрібно отримати всі пости від автора по імені carlo, необхідно прописати наступний запит:

$query = new WP_Query( array( ‘author_name’ => ‘carlo’ ) );

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

cat

category_name

category__and

category__in

category__not_in

Якщо потрібно отримає всі пости по категорії webdesign, необхідно просто поставити аргумент category_name, як показано нижче:

$query = new WP_Query( array( ‘category_name’ => ‘webdesign’ ) );

Запит нижче шукає всі пости за двома категоріями, кома тут замінює OR:

$query = new WP_Query( array( ‘category_name’ => ‘webdesign,webdev’ ) );

Також можна шукати посади, що належать до обох категорій webdesign і webdev, для цього необхідно поставить знак + між ними, він рівносильний AND:

$query = new WP_Query( array( ‘category_name’ => ‘webdesign+webdev’ ) );

Також можна передати масив ID:

$query = new WP_Query( array( ‘category__in’ => array( 4, 9 ) ) );
$query = new WP_Query( array( ‘category__and’ => array( 4, 9 ) ) );

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

$query = new WP_Query( array( ‘author_name’ => ‘carlo’, ‘category_name’ => ‘webdesign’ ) );

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

Мета-запити WordPress

У кодексі зазначено, що при роботі з мета-зпросами WP_Query використовує клас WP_Meta_Query. Даний клас вперше з’явився в WordPress 3.2 і будує SQL-код запитів на основі користувальницьких полів. Щоб створити запит на основі лише одного користувальницького поля, нам потрібно один або більше аргументів:

meta_key

meta_value

meta_value_num

meta_compare

Припустимо, користувальницький тип постів називається accommodation. Давайте присвоїмо кожному accommodation настроюване поле city, в якому буде зберігатися географічне розташування. За допомогою мета-запиту ми можемо витягнути з БД всі пости за типом accommodation з певним містом. Для цього потрібно всього лише передати потрібні аргументи в запит, як показано нижче:

$args = array(
‘post_type’ => ‘житло’,
‘meta_key’ => ‘city’,
‘meta_value’ => ‘Freiburg’,
‘meta_compare’ => ‘LIKE’ );

Після створення аргументів можна будувати запит, як ми вже це робили раніше:

// Запит
$the_query = new WP_Query( $args );
// Loop
if ( $the_query->have_posts() ) {
while ( $the_query->have_posts() ) : $the_query->the_post();
// ваш код
endwhile;
} else {
// посади не знайдені
}
/* відновлюємо postdata */
wp_reset_postdata();

Вставте код вище файл шаблона і ви отримаєте архів усіх постів з типом accommodations, написаних у місті Freiburg.
Це був приклад з одним користувача полем. А що, якщо нам потрібно створити запит на основі декількох користувальницьких полів?

meta_query аргумент

Для такого запиту в класі WP_Meta_Query є параметр meta_query. Це масив масивів:

$args = array(
‘post_type’ => ‘житло’,
‘meta_query’ => array(
array(
‘key’ => ‘city’,
‘value’ => ‘Freiburg’,
‘compare’ => ‘LIKE’,
),
)
);

Параметр meta_query – це двовимірний масив, чиї осередки є окремими мета-запитами з наступними аргументами:

Як створити просунутий пошук в WordPress за допомогою WP_Query

Якщо задати більше одного користувальницького поля, нам потрібно призначити елементу meta_query аргумент relation. Після всього цього ми можемо побудувати більш просунутий запит. Почнемо з створення аргументів і нового об’єкта WP_Query:

$args = array(
‘post_type’ => ‘житло’,
‘meta_query’ => array(
array( ‘key’ => ‘city’, ‘value’ => ‘Paris’, ‘compare’ => ‘LIKE’ ),
array( ‘key’ => ‘type’, ‘value’ => ‘room’, ‘compare’ => ‘LIKE’ ),
‘relation’ => ‘AND’
)
);
$the_query = new WP_Query( $args );

Тут в аргументі meta_query зберігається два масиву з мета-запитами, а третій параметр встановлює зв’язок між запитами. Запит просіює таблицю wp_posts на всі пости типу accommodation з настроюваними полями city = «Paris» type = «room».

Скопіюйте код вище файл шаблона archive-accommodation.php. При запиті з даними параметрами WP проведений пошук в таблиці wp_posts, а Loop покаже доступні результати.

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

Фільтр pre_get_posts

Екшен pre_get_posts запускається після створення об’єкта $query, але перед його виконанням. Щоб модифікувати запит, нам доведеться прикріпити свою колбек функцію pre_get_posts.

В одному з попередніх прикладів ми витягували всі пости заданого автора з категорією webdesign. А в прикладі нижче ми будемо передавати ті ж аргументи на об’єкт $query, однак на цей раз ми не будемо це робити в файлі шаблону, а використовуємо основний файл плагіна (або файл теми functions.php). Напишемо наступний блок коду:

function myplugin_pre_get_posts( $query ) {
// check if the user is requesting an admin page
// or current query is not the main query
if ( is_admin() || ! $query->is_main_query() ){
return;
}
$query->set( ‘author_name’, ‘carlo’ );
$query->set( ‘category_name’, ‘webdesign’ );
}
add_action( ‘pre_get_posts’, ‘myplugin_pre_get_posts’, 1 );

Об’єкт $query передається в колбек функцію не за значенням, а по посиланню, що означає, що будь-які зміни в запиті безпосередньо впливають на об’єкт $query. У кодексі зазначено:

«З допомогою екшену pre_get_posts розробники можуть звертатися до об’єкта $query за посиланням (будь-які зміни в $query безпосередньо впливають на оригінальний об’єкт – повертати значення не обов’язково).»

Так як ми маніпулюємо вихідним об’єктом $query, треба дивитися, з яким запитом ми працюємо. Метод is_main_query перевіряє, чи є об’єкт $query основним запитом. В кодексі також зазначено, що фільтр pre_get_posts може вплинути як на панель адміністратора, так і на front-end сторінки. Тому вкрай рекомендується перевіряти запитувану сторінку з допомогою умовного тега is_admin.

Екшен pre_get_posts добре задокументований. Вам варто прочитати про нього в кодексі, де ви знайдете докладний опис і різні приклади використання.

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

Від теорії до коду: створюємо пошукову систему

Нам буде потрібно:

Створити структуру даних.

Зареєструвати користувальницькі змінні запиту.

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

Створити форму, значення полів якої будуть генеруватися програмно.

Створюємо структуру даних

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

Користувальницький тип поста: accommodation;

Користувацька таксономія: typology (мотель, будинок, готель, тощо)

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

Настроюване поле: _sm_accommodation_city

Інші користувальницькі поля

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

Як створити просунутий пошук в WordPress за допомогою WP_Query

Сторінка редагування поста типу accommodation, праворуч показані всі користувальницькі мета бокси та поля. На малюнку видно, як буде виглядати сраница Edit Accommodation з трьома користувацькими мета боксами, в яких зберігається таксономія Typology і кілька зареєстрованих полів.

Наша мета не аналізувати архітектуру даних WP, це за нас вже зробили користувачі сайту Smashing Magazine Daniel, Brian, Kevin, Josh та Justin. Якщо вам потрібно освіжити знання, можете прочитати їх статті та повернутися до моєї. Після створення архітектури даних необхідно зареєструвати змінні запиту.

Реєстрація змінних запиту

У попередній частині ми дізналися, що змінні запиту це пара key=value після знака питання в рядку URL. Однак перед тим, як ми зможемо обробити ці пари в нашому скрипті, їх необхідно зареєструвати в плагіні або файлі functions.php. Нам знадобляться лише дві змінні, за допомогою яких ми зможемо виконувати запит на основі значень відповідний користувальницьких полів:

/**
* Register custom query vars
*
* @link https://codex.wordpress.org/Plugin_API/Filter_Reference/query_vars
*/
function sm_register_query_vars( $vars ) {
$vars[] = ‘type’;
$vars[] = ‘city’;
return $vars;
}
add_filter( ‘query_vars’, ‘sm_register_query_vars’ );

От і все! Ми додали два додаткових параметра в запит до БД. Тепер необхідно написати URL типу: http://example.com/?type=XXX&city=YYY

Маніпуляція запитом

Додайте новий шматок коду в наш скрипт:

/**
* Build a custom query based on several conditions
* The pre_get_posts action gives developers access to the $query object by reference
* any changes you make to $query are made directly to the original object – no return value is requested
*
* @link https://codex.wordpress.org/Plugin_API/Action_Reference/pre_get_posts
*
*/
function sm_pre_get_posts( $query ) {
// check if the user is requesting an admin page
// or current query is not the main query
if ( is_admin() || ! $query->is_main_query() ){
return;
}
// edit the query only when post type is ‘житло’
// if it isn’t, return
if ( !is_post_type_archive( ‘accommodation’ ) ){
return;
}
$meta_query = array();
// add meta_query elements
if( !empty( get_query_var( ‘city’ ) ) ){
$meta_query[] = array( ‘key’ => ‘_sm_accommodation_city’, ‘value’ => get_query_var( ‘city’ ), ‘compare’ => ‘LIKE’ );
}
if( !empty( get_query_var( ‘type’ ) ) ){
$meta_query[] = array( ‘key’ => ‘_sm_accommodation_type’, ‘value’ => get_query_var( ‘type’ ), ‘compare’ => ‘LIKE’ );
}
if( count( $meta_query ) > 1 ){
$meta_query[‘relation’] = ‘AND’;
}
if( count( $meta_query ) > 0 ){
$query->set( ‘meta_query’, $meta_query );
}
}
add_action( ‘pre_get_posts’, ‘sm_pre_get_posts’, 1 );

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

Далі функція перевіряє доступність раніше зареєстрованих змінних запиту. Перевірка здійснюється за допомогою функції get_query_var, яка витягує публічні змінні запиту з HTTP запиту (більш докладно про get_query_var прочитайте в кодексі). Якщо хоч одна змінна існує, колбек функція створює по масиву на кожен мета-запит і поміщає їх в багатовимірний масив $meta_query.

Якщо є хоча б два мета-запиту, то до $meta_query додається аргумент relation зі значенням «AND». Після цього метод set зберігає $query для його подальшого виконання.

Вам не потрібно турбуватися про безпеку введених даних, так як за нас це роблять WP_Query і WP_Meta_Query (можете переглянути вихідний код WP_Query і WP_Meta_Query).

Створення форми пошуку

Дані з форми відправляються методом GET, а значить, атрибути полів форми name і value відправляються як змінні в URL (тобто змінні запиту). Тому ми задамо атрибутів name полів форми ті ж значення, що і в раніше зареєстрованих змінних запиту (city і type), а значення самих полів можуть бути призначені програмно за допомогою даних з БД або ручного введення користувача.

Спершу ми створимо шорткод, з допомогою якого адміни зможуть підключити форму пошуку до постів і сторінок сайту. Наш шорткод під’єднується до екшену init:

function sm_setup() {
add_shortcode( ‘sm_search_form’, ‘sm_search_form’ );
}
add_action( ‘init’, ‘sm_setup’ );

Далі ми створимо колбек функцію, яка буде виводити HTML код форми з трьома полями: користувальницької таксономією та двома настроюваними полями.

function sm_search_form( $args ){
// код
}

$args – масив атрибутів шорткода. Всередину функції ми додамо:

// Query
// meta_query очікує вкладені масиви навіть якщо у вас всього один запит
$sm_query = new WP_Query( array( ‘post_type’ => ‘житло’, ‘posts_per_page’ => ‘-1’, ‘meta_query’ => array( array( ‘key’ => ‘_sm_accommodation_city’ ) ) ) );
// The Loop
if ( $sm_query->have_posts() ) {
$cities = array();
while ( $sm_query->have_posts() ) {
$sm_query->the_post();
$city = get_post_meta( get_the_ID(), ‘_sm_accommodation_city’, true );
// заповнюємо всі входження масиву(без дублікатів)
if( !in_array( $city, $cities ) ){
$cities[] = $city;
}
}
}
} else{
echo ‘No accommodations yet!’;
return;
}
/* відновлюємо Post Data */
wp_reset_postdata();
if( count($cities) == 0){
return;
}
asort($cities);
$select_city = “;
$select_city .= “. __( ‘Select city’, ‘smashing_plugin’ ) . “;
foreach ($cities as $city ) {
$select_city .= “. $city . “;
}
$select_city .= “. “\n”;
reset($cities);

Ми створили запит, який витягує всі пости типу accommodation з заданим кастомным полем _sm_accommodation_city (підкреслення перед ім’ям означає приховане настроюване поле).

Цикл Loop не покаже пости типу accommodation, але додати елементи відповідного значення призначеного для користувача поля в масив $cities. За умовою дублікати будуть пропускатися. Якщо немає ні одного поста типу accommodation, функція припиняється; в іншому випадку елементи масиву сортуються і використовуються для виводу значень першої групи тегів option у випадаючому списку.

Як створити просунутий пошук в WordPress за допомогою WP_Query

Всі доступні міста у випадаючому списку. Друге полі форми це випадаючий список кастомних таксономії typology. Значення другої групи тегів option виводяться з допомогою get_terms. Код нижче генерує поле select для таксономії typology:

$args = array( ‘hide_empty’ => false );
$typology_terms = get_terms( ‘typology’, $args );
if( is_array( $typology_terms ) ){
$select_typology = “;
$select_typology .= “. __( ‘Select typology’, ‘smashing_plugin’ ) . “;
foreach ( $typology_terms as $term ) {
$select_typology .= ‘slug . ‘”>’ . $term->name . “;
}
$select_typology .= “. “\n”;
}

get_terms повертає масив всіх термінів набору таксономії в якості першого аргументу або у вигляді об’єкта WP_Error, якщо таксономія не існує. І цикл foreach виводить теги option випадаючого списку.

Як створити просунутий пошук в WordPress за допомогою WP_Query

Варіанти другого випадаючого списку. Залишилося останнє поле select, яке буде ставитися до призначеного для користувача поля type. Код:

$select_type = “;
$select_type .= “. __( ‘Select room type’, ‘smashing_plugin’ ) . “;
$select_type .= “. __( ‘Entire house’, ‘smashing_plugin’ ) . “;
$select_type .= “. __( ‘Private room’, ‘smashing_plugin’ ) . “;
$select_type .= “. __( ‘Shared room’, ‘smashing_plugin’ ) . “;
$select_type .= “. “\n”;

В цей раз, як можна помітити, набір опцій задано вручну. І тепер ми можемо вивести форму:

$output = “;
$output .= ‘

‘. esc_html( $select_city ) . ‘

‘;
$output .= ‘

‘. esc_html( $select_typology ) . ‘

‘;
$output .= ‘

‘. esc_html( $select_type ) . ‘

‘;
$output .= “;
$output .= ‘

‘;
return $output;

Ми створили приховане поле для публічної змінної запиту post_type. Коли користувач надсилає форму, WP отримує значення post_type і завантажує файл шаблону archive.php або якщо є archive-{post_type}.php. Якщо ви будете налаштовувати структуру HTML сторінки з результатами, для такої форми знадобиться спеціальний файл шаблону.

Як створити просунутий пошук в WordPress за допомогою WP_Query

На зображенні показана форма просунутого пошуку, яку ми створили в цій статті.

Пошук за будь-якого тексту

Створена нами форма дозволяє користувачам задавати три фільтра з величезного числа заздалегідь заданих опцій. Тепер ми покращимо пошукову систему і додамо текстове поле, щоб користувачі могли шукати пости типу accommodation за текстом. Зробити це можна за допомогою аргументу запиту s. Давайте змінимо форму:

$output = “;
$output .= ‘

‘;
$output .= ‘

‘. esc_html( $select_city ) . ‘

‘;
$output .= ‘

‘. esc_html( $select_typology ) . ‘

‘;
$output .= ‘

‘. esc_html( $select_type ) . ‘

‘;
$output .= “;
$output .= ‘

‘;

Завдяки текстового поля ми можемо передати в WP_Query нову пару ключ/значення, де ключ-це параметр s, а значення це текст, введений користувачем або обчислене значення функції get_search_query() (більш докладно в кодексі).

Як створити просунутий пошук в WordPress за допомогою WP_Query

Більш розширена пошукова форма. Останнє зауваження: у попередньому прикладі ми бачили, як WP завантажує файл шаблону архіву для показу результату запиту. Це відбувається тому, що ми не поставили умову пошуку. Коли в рядку запиту є параметр s, WP автоматично завантажує файл шаблону пошуку, як показано на останньому зображенні нижче.

Як створити просунутий пошук в WordPress за допомогою WP_Query

Висновок

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