Tại sao WordPress mặc định không tìm kiếm trang (pages)?
Mặc định WordPress chỉ tìm kiếm trong bài viết (posts) và bỏ qua trang (pages). Điều này xảy ra vì WordPress được thiết kế ban đầu như một nền tảng blog, nơi bài viết là nội dung chính còn trang chỉ dùng cho thông tin tĩnh như Giới thiệu, Liên hệ, Chính sách. Tuy nhiên, khi website của bạn phát triển và có nhiều trang chứa thông tin hữu ích, việc không tìm được trang qua thanh search khiến người dùng khó chịu và bỏ lỡ nội dung quan trọng.
Có hai cách để giải quyết vấn đề này: cài plugin như Search Everything hoặc Relevanssi, hoặc thêm một đoạn code nhỏ vào file functions.php của theme. Cách dùng code giúp bạn tránh cài thêm plugin không cần thiết, giảm nguy cơ xung đột và giữ cho website chạy nhanh hơn.
Cách thêm pages vào kết quả tìm kiếm WordPress
Để WordPress tìm kiếm cả bài viết lẫn trang, bạn cần sử dụng filter pre_get_posts. Filter này cho phép bạn thay đổi tham số của truy vấn (query) trước khi WordPress thực thi tìm kiếm. Dưới đây là đoạn code cần thêm vào file functions.php của theme đang sử dụng:
/**
* Cho phép search tìm kiếm cả bài viết (post) và trang (page)
* Hook vào pre_get_posts để thay đổi query trước khi thực thi
*/
function bunnywp_search_filter( $query ) {
// Chỉ thay đổi query ở frontend, không ảnh hưởng admin
if ( ! is_admin() && $query->is_search ) {
$query->set( 'post_type', array( 'post', 'page' ) );
}
return $query;
}
add_filter( 'pre_get_posts', 'bunnywp_search_filter' );
Giải thích code:
Hàm bunnywp_search_filter nhận vào đối tượng $query của WordPress. Đầu tiên, nó kiểm tra hai điều kiện quan trọng: ! is_admin() đảm bảo code chỉ chạy ở frontend và không ảnh hưởng đến bảng quản trị, $query->is_search xác nhận đây là truy vấn tìm kiếm. Khi cả hai điều kiện đúng, phương thức $query->set('post_type', array('post', 'page')) sẽ mở rộng phạm vi tìm kiếm để bao gồm cả bài viết và trang.
Mở rộng: Tìm kiếm custom post types
Ngoài posts và pages, WordPress còn hỗ trợ các loại nội dung tùy chỉnh (custom post types) như sản phẩm WooCommerce, portfolio, testimonials. Nếu bạn muốn bộ search tìm kiếm thêm các post type này, chỉ cần thêm tên post type vào mảng. Ví dụ, để tìm kiếm cả sản phẩm WooCommerce:
function bunnywp_search_all_post_types( $query ) {
if ( ! is_admin() && $query->is_search ) {
$query->set( 'post_type', array(
'post',
'page',
'product', // San pham WooCommerce
'portfolio', // Custom post type khac
) );
}
return $query;
}
add_filter( 'pre_get_posts', 'bunnywp_search_all_post_types' );
Bạn có thể kiểm tra danh sách tất cả post types đang hoạt động trên website bằng cách thêm đoạn code tạm sau vào functions.php, sau đó truy cập website và xem kết quả trong Debug Bar hoặc Query Monitor:
// Tam thoi hien thi tat ca post types - xoa sau khi xem xong
add_action( 'wp_footer', function() {
$post_types = get_post_types( array( 'public' => true ) );
echo '<pre>';
print_r( $post_types );
echo '</pre>';
} );
Loại trừ post types khỏi kết quả tìm kiếm
Đôi khi bạn muốn tìm kiếm pages nhưng lại không muốn hiện sản phẩm hay nội dung khác. Thay vì liệt kê từng post type muốn tìm, bạn có thể loại trừ những post type không cần thiết. Cách này hữu ích khi website có nhiều custom post types:
function bunnywp_search_exclude_types( $query ) {
if ( ! is_admin() && $query->is_search ) {
// Lay tat ca post types public hien co
$public_types = get_post_types( array( 'public' => true ) );
// Loai tr bo attachment (hinh anh, file)
unset( $public_types['attachment'] );
// Ban co the loai them post type khac o day
// unset( $public_types['product'] );
$query->set( 'post_type', array_keys( $public_types ) );
}
return $query;
}
add_filter( 'pre_get_posts', 'bunnywp_search_exclude_types' );
Hướng dẫn thêm code vào functions.php an toàn
Khi chỉnh sửa file functions.php, bạn nên tuân thủ các nguyên tắc sau để đảm bảo an toàn:
1. Sử dụng child theme: Nếu bạn đang dùng theme có bản cập nhật thường xuyên, hãy tạo child theme rồi thêm code vào functions.php của child theme. Điều này giúp code không bị mất khi cập nhật theme cha. Tham khảo cách tạo child theme trên codex WordPress.
2. Sử dụng plugin Code Snippets: Nếu không muốn tạo child theme, bạn có thể cài plugin Code Snippets miễn phí. Plugin này cho phép thêm code PHP qua giao diện admin, quản lý từng đoạn code riêng biệt và dễ dàng bật/tắt khi cần.
3. Backup trước khi sửa: Luôn sao lưu file functions.php gốc trước khi chỉnh sửa. Nếu code bị lỗi làm website không truy cập được, bạn có thể khôi phục qua FTP hoặc File Manager trong control panel hosting.
Một số vấn đề thường gặp và cách khắc phục
Vấn đề 1: Code không hoạt động sau khi thêm. Hãy kiểm tra xem bạn có thêm code đúng file functions.php không. Nếu dùng child theme, hãy chắc chắn child theme đang được kích hoạt. Ngoài ra, một số cache plugin có thể lưu kết quả tìm kiếm cũ, hãy xóa cache và thử lại.
Vấn đề 2: Kết quả tìm kiếm bị trộn lẫn với bài viết draft. Nếu trang admin hiện kết quả của draft posts, hãy thêm điều kiện kiểm tra ! is_admin() như trong code ví dụ ở trên. Điều kiện này đảm bảo filter chỉ tác động ở frontend.
Vấn đề 3: Xung đột với plugin tìm kiếm. Nếu bạn đã cài plugin như SearchWP, Relevansmi hay Ivory Search, các plugin này có thể ghi đè lên filter pre_get_posts. Trong trường hợp này, bạn nên cấu hình trực tiếp trong plugin thay vì dùng code, hoặc vô hiệu hóa plugin nếu muốn dùng code.
Tổng kết
Việc cho phép WordPress tìm kiếm cả trang (pages) chỉ cần một đoạn code ngắn gọn trong functions.php. Phương pháp này nhẹ, nhanh và không phụ thuộc vào plugin bên thứ ba. Bạn còn có thể mở rộng thêm để tìm kiếm custom post types hoặc loại trừ những nội dung không muốn xuất hiện trong kết quả. Hãy nhớ dùng child theme hoặc plugin Code Snippets để bảo vệ code khi cập nhật theme.
Xem thêm bài viết liên quan: Cấu hình bộ search chỉ search tiêu đề, không sử dụng Plugin hoặc Tăng cường độ chính xác tìm kiếm cho WordPress.
Thực ra mình chỉ là người dùng tự mày mò, toàn bộ kiến thức trong bài đến từ quá trình vọc vạch cá nhân. Nội dung này không thay thế được một website được dựng đúng nghĩa. Nếu bạn cần dựng tử tế, có thể tham khảo đội ngũ thiết kế web chuyên – mình hay giới thiệu bạn bè qua TaigaWeb.

