Створення модального вікна пошуку для сайтів WordPress із обмеженим доступом
Більшість туторіалів із пошуку у WordPress занадто прості. Вони радять просто додати віджет у хедер. Це працює для публічних блогів, але не підходить для сайтів із платним доступом (membership sites).
Якщо у вас є платні курси або приватні відео, стандартний пошук може призвести до витоку даних. Він показує назви приватного контенту користувачам, які не авторизовані. Це руйнує ваш paywall.
Я створив кастомне модальне вікно пошуку для фітнес-сайту, використовуючи WordPress, WooCommerce та LearnDash. Ось як побудувати пошук, що дотримується правил доступу.
Архітектура
Я використав єдиний уніфікований індекс замість окремих пошуків для кожного типу контенту. Це дозволило мені застосовувати обмеження доступу на рівні запиту.
Результати пошуку відповідають таким правилам:
- Пости в блозі є публічними.
- Відео за запитом мають обмежений доступ.
- Курси мають обмежений доступ через LearnDash.
- Товари в магазині є публічними.
Я створив кастомний REST route у дочірній темі. Я уникав плагінів для фрагментів коду (snippet plugins), щоб забезпечити стабільність пошуку.
Ключові інженерні деталі
• Обмеження на стороні сервера (Server-Side Gating): Ніколи не приховуйте результати за допомогою JavaScript. Якщо ви приховуєте результат у браузері, дані все одно залишаються у відповіді мережі. Користувач може побачити їх у DevTools. Ви повинні фільтрувати дані на сервері перед тим, як вони покинуть сайт.
• Управління кешуванням: Якщо ви кешуєте результати пошуку, ви можете надати приватні результати учасника сторонній особі. Виключіть ваш пошуковий REST route із кешу сторінок, щоб запобігти витокам.
• Поступова деградація (Graceful Degradation): Використовуйте перевірки (guards) при виклику сторонніх плагінів, таких як Relevanssi. Якщо плагін не працює, пошук має переключитися на стандартний пошук WordPress, а не призводити до збою сайту.
• Продуктивність: Використовуйте функцію debounce (250 мс) та AbortController. Це запобігає надмірним запитам від браузера на кожне натискання клавіші. Це також скасовує старі запити, щоб застарілі дані не перезаписували нові результати.
• Безпека: Завжди екрануйте (escape) рядки перед використанням innerHTML. Це запобігає XSS-атакам через шкідливі заголовки постів.
Урок для мобільних пристроїв
Я зіткнувся з проблемою, коли page builder «поглинав» мою кнопку пошуку всередині мобільного меню. Я пробував багато виправлень через CSS, але вони не працювали.
Рішення було простим: припиніть боротися з темою. Замість того, щоб поміщати кнопку всередину меню, я вставив її в хедер як окремий елемент. Якщо компонент чинить опір вашим змінам, розмістіть свій елемент поруч із ним, а не всередині нього.
Підсумок найкращих практик:
- Застосовуйте контроль доступу на сервері.
- Виключайте пошукові ендпоінти (endpoints) із кешу.
- Використовуйте debounce та AbortController для плавного UX.
- Екрануйте всі дані API для запобігання XSS.
- Розміщуйте елементи поза межами «впертих» контейнерів теми.
Джерело: https://dev.to/highcenburg/building-a-search-modal-for-a-membership-gated-wordpress-site-b92
