1. Tạo route REST API với method POST
Mặc định WordPress hỗ trợ các method: GET, POST, PUT, DELETE. Ví dụ sau tạo một route POST để lưu feedback:
add_action('rest_api_init', function () {
register_rest_route('demo/v1', '/feedback', [
'methods' => 'POST',
'callback' => 'demo_api_save_feedback',
'permission_callback' => '__return_true', // Cho phép cả khách
]);
});
function demo_api_save_feedback($request) {
$message = sanitize_text_field($request->get_param('message'));
if (empty($message)) {
return new WP_Error('empty_message', 'Nội dung trống.', ['status' => 400]);
}
// Ví dụ: lưu vào log file (có thể lưu vào DB tùy ý)
error_log('Feedback: ' . $message);
return [
'status' => 'success',
'message' => 'Gửi feedback thành công!',
];
}
Gửi thử bằng JavaScript:
fetch('/wp-json/demo/v1/feedback', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({ message: 'Tôi rất thích plugin này!' })
});
2. Xác thực người dùng khi gọi REST API
Để hạn chế quyền, bạn cần viết permission_callback. Ví dụ: chỉ cho người đã đăng nhập mới được gọi:
'permission_callback' => function () {
return is_user_logged_in();
}
Hoặc nâng cao hơn – chỉ user có quyền edit_posts:
'permission_callback' => function () {
return current_user_can('edit_posts');
}
Nếu chưa đăng nhập, WordPress sẽ tự trả lỗi 401 Unauthorized.
3. Trả lỗi đúng chuẩn với WP_Error
Để trả lỗi đúng cấu trúc, hãy dùng WP_Error:
return new WP_Error('invalid_data', 'Dữ liệu không hợp lệ', ['status' => 422]);
Kết quả trả về sẽ có dạng:
{
"code": "invalid_data",
"message": "Dữ liệu không hợp lệ",
"data": {
"status": 422
}
}
4. Lưu dữ liệu cho user hiện tại
Ví dụ: lưu “vị trí đọc” vào user_meta thông qua REST API (chỉ user đã đăng nhập):
add_action('rest_api_init', function () {
register_rest_route('demo/v1', '/save-position', [
'methods' => 'POST',
'callback' => 'demo_api_save_position',
'permission_callback' => function () {
return is_user_logged_in();
},
]);
});
function demo_api_save_position($request) {
$position = intval($request->get_param('scroll'));
$user_id = get_current_user_id();
if ($position < 0) {
return new WP_Error('invalid_scroll', 'Giá trị không hợp lệ.', ['status' => 400]);
}
update_user_meta($user_id, '_reading_position', $position);
return [
'status' => 'success',
'saved' => $position,
];
}
5. Gợi ý cấu trúc JSON chuẩn khi thiết kế API
Để frontend dễ làm việc, bạn nên giữ cấu trúc thống nhất. Gợi ý:
{
"status": "success" | "error",
"message": "Thông điệp rõ ràng",
"data": {...} // Nếu có
}
Với lỗi dùng WP_Error, còn lại nên luôn bao bên ngoài bằng status + message.
Kết luận
REST API không chỉ là “cách lấy bài viết” – nó là nền tảng để bạn tạo hệ thống tương tác hiện đại, tách riêng frontend và backend, hỗ trợ JavaScript linh hoạt mà không phụ thuộc admin-ajax.php.
Sau khi làm chủ REST API, bạn có thể viết bất cứ plugin nào theo kiểu SPA, hoặc các chức năng cao cấp như:
- Lưu vị trí đọc, trạng thái người dùng (Init Reading Position)
- Đếm view an toàn, phân quyền submit (Init View Count)
- Tìm kiếm real-time (Init Live Search)
Nếu bạn muốn viết plugin phục vụ frontend hiện đại – REST API chính là con đường đúng đắn.
Bình luận