Функція пошуку в WordPress має погану репутацію, тому існує маса різних плагінів, які дозволяє внести певні вдосконалення в неї, однак вони не завжди пропонують те, що вам потрібно, особливо якщо ви хочете створити додаткову систему пошуку під деякі фіксовані вимоги.
У даній статті ми подивимося на те, як створити свій власний пошук в WordPress, і заодно розкриємо деякі пов'язані з цим секрети.
Незважаючи на численні плагіни, які дозволяють поліпшити різні аспекти пошуку WordPress, починаючи з упорядкування за релевантністю і закінчуючи включенням довільних полів в пошук, бувають такі ситуації, коли плагіни, причому в будь-яких своїх комбінаціях, не здатні виконати саме того, що вам потрібно, і в результаті вам доводиться писати свій власний код.
Покращуємо пошук в WordPress шляхом додавання розширеної пошукової форми
За пошук WordPress відповідає клас WP_Query. Якщо ви раніше працювали з довільними циклами, то ви маєте уявлення про WP_Query.
WP_Query має масу можливих параметрів, багато з яких можуть бути легко визначені в пошуковій формі (або безпосередньо в URL), що змінить поведінку пошуку.
Наприклад, щоб перетворити звичайний пошук в пошук по довільному типу записів з назвою product, досить ввести наступне:
У підсумку ми отримаємо результати для записів з типом product, які містять в своєму заголовку або контенті слово football.
Пам'ятайте, що для пошуку важливо включати параметр s в URL.
Існує також багато додаткових параметрів, за допомогою яких можна повністю змінити поведінку, але які, на жаль, не задокументовані в кодексі.
Пошук по фразі
За замовчуванням WordPress робить пошук за ключовим словом. Це означає, що якщо в пошук переданий запит «football boots», то WordPress формує наступний код для умови WHERE:
Як ви можете бачити, тут поставлено не пошук цілої фрази, а пошук окремих слів - «football» в заголовку або контенті і «boots» в заголовку або контенті. Таким чином, запис, що містить слово «boot» в заголовку і «football» в контенті не буде, очевидно, відповідати тому, що хотів отримати користувач, однак саме вона буде видана на екран.
Ви можете, правда, зробити так, щоб WordPress шукав фрази - для цього досить додати sentence = 1 в URL, що призведе до зміни умови WHERE:
Тепер пошук ведеться по фразі, тому заголовок або контент матеріалу повинен фактично містити обидва слова (не обов'язково підряд), щоб бути знайденим і виданими на екран. Спробуйте це зробити на своєму власному сайті. Запустіть звичайний пошук, після чого додайте sentence = 1 до URL, і ви побачите, в чому полягає різниця.
Пошук точного збігу
Пов'язаним з sentence, однак більш специфічним є параметр exact. Додавання exact = 1 до URL призведе до наступних змін в умови WHERE:
Замість того щоб розшукувати відмінності, я відразу скажу вам, що єдина різниця між умовах sentence і exact полягає у видаленні% навколо фрази в операторах LIKE. Таке видалення має велике значення, оскільки тепер заголовок або контент повинен точно відповідати пошуковому запиту, а не просто включати його в себе.
Тобто, якщо жоден продукт не має в заголовку фрази «football boots», то ніяких результатів видано не буде. Використовувати exact потрібно дуже обережно.
Зміна пошукової форми
Стандартна пошукова форма в WordPress досить проста:
Якщо ви хочете змінити пошукову поведінку, то в такому випадку вам потрібно додати ваші власні поля в форму.
Ця форма при відправленні буде генерувати наступний URL:
Вона як і раніше буде викликати стандартну сторінку пошукових результатів, однак ці результати будуть вже для довільного типу записів product, причому видаються записи повинні будуть містити пошукову фразу або в своєму заголовку, або в контенті.
Найпростіший спосіб створити свою власну пошукову форму, припускаючи, що ви хочете залишити стандартну форму в своєму первісному вигляді - це створити новий шаблон сторінки з пошукової формою, закодованої під ваші вимоги, і прив'язати його до певної сторінці.
Якщо ж ви хочете оновити дефолтну пошукову форму - щоб запустити пошук по фразах, наприклад - то в такому випадку у вас є два варіанти, як вчинити; в даному випадку ми будемо припускати, що в вашому шаблоні пошукова форма не є жорстко кодованого:
- Перший варіант - помістити довільну пошукову форму в шаблон searchform.php. Всякий раз, коли функція get_search_form () буде викликана, вона в першу чергу буде використовувати даний шаблон.
- Другий варіант - використовувати фільтр get_search_form, що змусить WordPress звернутися до вашої довільній формі пошуку.
Обидві ці техніки в деталях описані в кодексі.
Коли довільної форми недостатньо
Незважаючи на те що за допомогою довільної форми пошуку можна зробити дуже і дуже багато, її часом буває недостатньо. Існують такі випадки, коли вам потрібно створити свій WP_Query і обробити результати самостійно - зокрема, коли ви додаєте додаткову функцію пошуку.
Наш приклад буде стосуватися комерційного сайту компанії, яка продає якусь суміш фізичних і цифрових товарів. Велика частина цифрових товарів - це минулі номери двох журналів, які випускалися разом з буклетами в цифровому та друкованому форматі.
Компанія хотіла б реалізувати пошук по бібліотеці, який дозволить відвідувачам шукати тільки журнали і буклети з певних фраз. На сайті вже був реалізований пошук по продуктам, проте результати були не дуже хорошими:
- Виводилося занадто багато нерелевантних результатів
- Включалися всі товари
- Не було індикації щодо того, який пошукової терм був знайдений, результатами пошуку були звичайні зображення товарів
Щоб не чіпати поточний пошук, була створена нова функція, яка:
Перші дві вимоги можна було фактично реалізувати за допомогою довільної пошукової форми:
Однак вона не змогла б допомогти в разі розмітки для пошукових результатів і підсвічування пошукових фраз, тому був створений новий шаблон сторінки, який зв'язувався з окремою сторінкою.
Ось основна логіка шаблону:
Як ви можете бачити, форма пошуку нагадує стандартну пошукову форму в WordPress, оскільки всі маніпуляції з викликом WP_Query виконуються через код, де:
Важливо відзначити, що в цьому рішенні відсутня пагінація. Для довільного, специфічного пошуку пагінація не так потрібна, особливо якщо виконується пошук по фразі.
Ви можете помітити, що якщо пошукові результати будуть відсутні, то в такому випадку на екран будуть виведені кілька пов'язаних товарів, щоб відвідувач не покинув сторінку.
Висновок результатів вимагає додавання двох додаткових функцій - однієї для отримання тексту, який містить пошукову фразу, і інший для підсвічування фрази.
Підсвічування фрази реалізована за допомогою простого регулярного виразу.
Отримання тексту, що містить пошукову фразу, виявилося не найпростішим дією. Цьому сильно посприяв той факт, що контент кожного товару виводиться у вигляді невпорядкованого списку з заголовком і описом, проте спроба пошуку відповідного регулярного виразу не закінчилася нічим, тому я вирішив звернутися до обробки рядків.
Результат вийшов, проте, досить хорошим:
Довільні форми ідеальні, коли ви хочете реалізувати додатковий пошук
Довільні пошукові форми та функції ідеальні в тому випадку, якщо ви хочете додати додаткову пошукову функцію, яка буде працювати паралельно основній функції пошуку і володіти деякими обмеженнями.
У більшості випадків ви зможете реалізувати те, що вам потрібно, шляхом використання довільної пошукової форми, яка передає належні параметри у вбудовану функцію пошуку. Ви можете легко протестувати використання параметрів, додавши їх до URL пошуку.
Варто зауважити, що написання своєї власної функції пошуку - не найскладніша задача. Ви можете скористатися додатковими параметрами, щоб управляти поведінкою пошуку.