REST API nâng cao cho plugin WordPress: hỗ trợ POST, xác thực, trả lỗi chuẩn

Sau khi đã nắm cơ bản về cách tạo route GET trong REST API, bước tiếp theo là làm việc với method POST, xử lý xác thực và trả lỗi đúng chuẩn. Đây là phần thiết yếu nếu bạn muốn plugin có chức năng như: gửi form, lưu dữ liệu người dùng, chèn comment, hoặc xử lý action từ frontend.

REST API nâng cao cho plugin WordPress: hỗ trợ POST, xác thực, trả lỗi chuẩn

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


  • Không có bình luận.

Init Toolbox

Nhấn Ctrl + \ trên máy tính, hoặc vuốt sang trái ở bất kỳ đâu trên mobile.

Đăng nhập





Đang tải...