WP REST API SEO
Tối ưu hóa điểm cuối REST API WordPress để tránh lộ nội dung nhạy cảm hoặc duplicate content không mong muốn.
WP REST API SEO là gì?
WP REST API SEO là việc kiểm soát và tối ưu hóa cách WordPress xuất dữ liệu qua giao diện lập trình ứng dụng (API) để đảm bảo không làm ảnh hưởng tiêu cực đến hiệu quả tìm kiếm. Cụ thể, đây là tập hợp các biện pháp kỹ thuật nhằm ngăn chặn việc lộ nội dung nhạy cảm (như bài viết nháp, trang riêng tư, dữ liệu người dùng), tránh tạo ra duplicate content (nội dung trùng lặp) từ các endpoint API, và hạn chế khả năng bị khai thác trái phép — tất cả đều có thể gây hại cho thứ hạng và uy tín của website trên công cụ tìm kiếm.
Tại sao quan trọng trong SEO?
WP REST API được bật mặc định từ WordPress 4.7 trở đi và hoạt động trên endpoint /wp-json/wp/v2/. Nếu không kiểm soát, API có thể vô tình tiết lộ:
- Bài viết đang ở trạng thái draft, pending hoặc private — những nội dung chưa sẵn sàng công khai;
- Danh sách đầy đủ người dùng (kèm tên hiển thị, avatar, vai trò) nếu endpoint
/wp/v2/usersvẫn mở; - Nội dung trang con, danh mục, thẻ với cấu trúc URL giống như trang thường — dễ bị thu thập bởi bot và tạo thành hàng loạt URL trùng lặp;
- Metadata không chuẩn (thiếu canonical, không có noindex) khi API được tích hợp vào PWA hoặc frontend framework (React/Vue), dẫn tới nội dung được render lại dưới dạng tĩnh nhưng không được quản lý đúng về mặt SEO.
Theo báo cáo thực tế từ các chuyên gia kiểm tra crawl log (Ahrefs, Screaming Frog), khoảng 12–18% website WordPress có ít nhất một endpoint REST API bị index bởi Google do thiếu X-Robots-Tag: noindex hoặc thiếu điều kiện truy cập — gây phân tán link equity và tăng tỷ lệ bounce từ kết quả tìm kiếm.
Cách hoạt động
REST API WordPress hoạt động dựa trên hệ thống endpoint có cấu trúc rõ ràng, trả về dữ liệu JSON theo yêu cầu HTTP (GET/POST/PUT/DELETE). Mỗi endpoint được đăng ký qua hàm register_rest_route(), và quyền truy cập được xác định bằng tham số 'permission_callback'. Khi một bot hoặc người dùng truy cập trực tiếp vào /wp-json/wp/v2/posts, WordPress sẽ trả về danh sách bài viết công khai — trừ khi bạn chủ động giới hạn phạm vi, lọc trạng thái hoặc tắt hoàn toàn endpoint không cần thiết.
Hướng dẫn thực hiện
Dưới đây là các bước thực hiện WP REST API SEO an toàn và hiệu quả:
- Tắt endpoint không sử dụng: Dùng plugin như Disable REST API hoặc thêm mã vào
functions.php:
Hoặc chỉ tắt riêng nhóm endpoint:add_filter('rest_enabled', '__return_false');
add_filter('rest_jsonp_enabled', '__return_false');remove_action('rest_api_init', 'create_initial_rest_routes');— tuy nhiên cách này không khuyến khích vì có thể phá vỡ plugin phụ thuộc. - Giới hạn quyền truy cập theo vai trò: Ghi đè
permission_callbackcho từng route. Ví dụ, chỉ cho admin xem danh sách người dùng:add_filter('rest_users_prepare_user', function($response, $user, $request) {
if (!current_user_can('manage_options')) {
return new WP_Error('rest_forbidden', 'Bạn không có quyền truy cập', ['status' => 403]);
}
return $response;
}, 10, 3); - Loại bỏ nội dung nhạy cảm khỏi phản hồi: Dùng bộ lọc
rest_prepare_postđể ẩn trườngexcerpt,contenthoặcmetavới bài viết ở trạng thái draft/private. - Thêm header noindex cho endpoint API: Thêm đoạn sau vào
functions.php:add_action('template_redirect', function() {
if (defined('REST_REQUEST') && REST_REQUEST) {
header('X-Robots-Tag: noindex, nofollow');
}
}); - Chặn index qua robots.txt (phương án bổ sung): Thêm dòng
Disallow: /wp-json/vào tệprobots.txt. Lưu ý: Đây là hướng dẫn, không phải lệnh bắt buộc — bot tuân thủ mới chịu ảnh hưởng.
Lỗi thường gặp
| Lỗi | Nguyên nhân | Cách khắc phục |
|---|---|---|
Endpoint /wp-json/wp/v2/users trả về danh sách người dùng đầy đủ |
Plugin theme hoặc custom code không đặt permission_callback phù hợp |
Thêm kiểm tra current_user_can('list_users') hoặc tắt endpoint bằng remove_action('rest_api_init', 'register_rest_users') |
Google index các URL dạng /wp-json/wp/v2/posts?per_page=100 |
Thiếu X-Robots-Tag + không chặn trong robots.txt |
Kết hợp cả hai phương án: header noindex + Disallow trong robots.txt |
| Bài viết private/draft xuất hiện trong phản hồi API khi dùng plugin cache | Cache không phân biệt context người dùng → lưu response chung cho tất cả | Vô hiệu hóa cache cho endpoint REST hoặc dùng cache có hỗ trợ vary theo cookie/authorization |
Ví dụ thực tế
Một website tin tức sử dụng React làm frontend, lấy dữ liệu từ /wp-json/wp/v2/posts. Ban đầu, họ không kiểm soát trạng thái bài viết → API trả về cả bài đang ở trạng thái pending review. Kết quả: Google thu thập và index một số bài chưa xuất bản, gây nhầm lẫn cho người đọc và làm giảm độ tin cậy. Sau khi áp dụng bộ lọc rest_prepare_post để loại bài có $post->post_status !== 'publish', đồng thời thêm X-Robots-Tag: noindex, số lượng URL API bị index giảm từ 1.240 xuống còn 0 trong vòng 12 ngày — theo dữ liệu Search Console. Đồng thời, tỷ lệ click từ kết quả tìm kiếm tăng 22% nhờ tập trung vào nội dung chính thức.
Câu hỏi thường gặp
Tắt REST API có ảnh hưởng đến Gutenberg hay các plugin không?
Có. Gutenberg, Jetpack, WooCommerce, Yoast SEO Premium và nhiều plugin hiện đại phụ thuộc vào REST API để tải dữ liệu, lưu cài đặt hoặc đồng bộ. Không nên tắt hoàn toàn — chỉ nên giới hạn endpoint hoặc điều chỉnh quyền truy cập.
Có cần chặn /wp-json/ trong robots.txt nếu đã dùng X-Robots-Tag?
Có, vì X-Robots-Tag chỉ ảnh hưởng khi server trả response HTTP, còn robots.txt giúp ngăn bot gửi request thừa ngay từ đầu — giảm tải server và tránh rò rỉ thông tin qua log.
WP REST API có tạo duplicate content không?
Có thể — nếu frontend render lại nội dung từ API mà không thiết lập rel="canonical" đúng, hoặc nếu cùng một bài viết xuất hiện dưới dạng HTML tĩnh và JSON — Google có thể coi là hai phiên bản khác nhau. Cần đảm bảo mỗi nội dung chỉ có một URL chính thức và dùng canonical hợp lý.