Xây dựng Modal Tìm kiếm cho các Trang WordPress có Giới hạn Truy cập
Hầu hết các hướng dẫn tìm kiếm WordPress đều quá đơn giản. Chúng bảo bạn chỉ cần chèn một widget vào header. Cách này hiệu quả với các blog công khai, nhưng lại thất bại với các trang web thành viên.
Nếu bạn có các khóa học trả phí hoặc video riêng tư, tính năng tìm kiếm mặc định có thể làm rò rỉ dữ liệu. Nó hiển thị tiêu đề của nội dung riêng tư cho những người dùng chưa đăng nhập. Điều này sẽ phá hỏng lớp tường phí (paywall) của bạn.
Tôi đã xây dựng một modal tìm kiếm tùy chỉnh cho một trang web thể hình sử dụng WordPress, WooCommerce và LearnDash. Dưới đây là cách xây dựng tính năng tìm kiếm tuân thủ các quy tắc truy cập.
Kiến trúc
Tôi đã sử dụng một chỉ mục thống nhất duy nhất thay vì các tìm kiếm riêng biệt cho từng loại nội dung. Điều này cho phép tôi thực thi việc giới hạn truy cập ngay tại cấp độ truy vấn (query level).
Kết quả tìm kiếm tuân theo các quy tắc sau:
- Các bài viết blog là công khai.
- Các video theo yêu cầu (on-demand) là nội dung giới hạn.
- Các khóa học được giới hạn thông qua LearnDash.
- Các sản phẩm trong cửa hàng là công khai.
Tôi đã xây dựng một REST route tùy chỉnh trong child theme. Tôi tránh sử dụng các plugin chèn đoạn mã (snippet plugins) để đảm bảo tính năng tìm kiếm luôn hoạt động ổn định.
Các chi tiết kỹ thuật quan trọng
• Giới hạn phía máy chủ (Server-Side Gating): Đừng bao giờ ẩn kết quả bằng JavaScript. Nếu bạn ẩn một kết quả trên trình duyệt, dữ liệu đó vẫn nằm trong phản hồi mạng (network response). Người dùng có thể nhìn thấy nó trong DevTools. Bạn phải lọc dữ liệu trên máy chủ trước khi nó rời khỏi trang web.
• Quản lý bộ nhớ đệm (Cache Management): Nếu bạn lưu bộ nhớ đệm cho kết quả tìm kiếm, bạn có thể vô tình hiển thị kết quả riêng tư của một thành viên cho một người lạ. Hãy loại trừ REST route tìm kiếm của bạn khỏi bộ nhớ đệm trang (page cache) để ngăn chặn rò rỉ.
• Khả năng hoạt động ổn định khi gặp lỗi (Graceful Degradation): Sử dụng các trình kiểm tra (guards) khi gọi các plugin bên thứ ba như Relevanssi. Nếu plugin gặp lỗi, tính năng tìm kiếm nên chuyển về tìm kiếm mặc định của WordPress thay vì làm sập trang web.
• Hiệu suất (Performance): Sử dụng hàm debounce (250ms) và AbortController. Điều này ngăn trình duyệt gửi một yêu cầu mới cho mỗi phím bấm. Nó cũng hủy các yêu cầu cũ để dữ liệu cũ không ghi đè lên kết quả mới.
• Bảo mật (Security): Luôn escape các chuỗi trước khi sử dụng innerHTML. Điều này giúp ngăn chặn các cuộc tấn công XSS từ các tiêu đề bài viết độc hại.
Bài học về di động
Tôi đã gặp khó khăn với một trình xây dựng trang (page builder) tự động "nuốt" nút tìm kiếm của tôi vào trong menu di động. Tôi đã thử nhiều cách sửa bằng CSS nhưng đều thất bại.
Giải pháp rất đơn giản: Đừng cố đối đầu với theme. Thay vì đặt nút bên trong menu, tôi đã chèn nó vào header như một phần tử riêng biệt. Nếu một thành phần (component) chống lại các thay đổi của bạn, hãy đặt phần tử của bạn bên cạnh nó thay vì đặt bên trong nó.
Tóm tắt các phương pháp hay nhất:
- Thực thi kiểm soát truy cập trên máy chủ.
- Loại trừ các endpoint tìm kiếm khỏi bộ nhớ đệm.
- Sử dụng
debouncevàAbortControllerđể có trải nghiệm người dùng (UX) mượt mà. - Escape tất cả dữ liệu API để ngăn chặn XSS.
- Đặt các phần tử bên ngoài các container cứng nhắc của theme.
Source: https://dev.to/highcenburg/building-a-search-modal-for-a-membership-gated-wordpress-site-b92
