Dưới đây là WordPress REST API Cheatsheet nâng cao, dành cho lập trình viên cần thao tác với REST API trong theme, plugin hoặc headless frontend.
1. Tổng Quan REST API trong WordPress
- WordPress tích hợp REST API từ phiên bản 4.7+
- API mặc định sẵn cho:
posts
,pages
,users
,comments
,taxonomies
,media
,settings
, v.v. - Endpoint mặc định:
https://yourdomain.com/wp-json/
2. Cấu trúc Endpoint
/wp-json/{namespace}/{route}
Ví dụ:
/wp-json/wp/v2/posts
/wp-json/wp/v2/users/5
/wp-json/myplugin/v1/data
3. Lấy Dữ Liệu (GET)
GET /wp-json/wp/v2/posts
GET /wp-json/wp/v2/posts?per_page=5&orderby=modified
GET /wp-json/wp/v2/users/3
GET /wp-json/wp/v2/pages?slug=gioi-thieu
- Kết quả trả về là JSON
- Hỗ trợ phân trang qua
?_embed
,_fields
,per_page
,page
, v.v.
4. Tạo Mới (POST)
POST /wp-json/wp/v2/posts
Authorization: Bearer YOUR_TOKEN
Content-Type: application/json
{
"title": "Bài viết mới",
"content": "Nội dung chi tiết",
"status": "publish"
}
- Cần xác thực (Authentication)
- Các method
POST
,PUT
,DELETE
không hoạt động nếu không login hoặc dùng token/API key hợp lệ
5. Cập Nhật (PUT/PATCH)
POST /wp-json/wp/v2/posts/123
Authorization: Bearer YOUR_TOKEN
{
"title": "Cập nhật tiêu đề"
}
6. Xoá (DELETE)
DELETE /wp-json/wp/v2/posts/123?force=true
Authorization: Bearer YOUR_TOKEN
force=true
để xóa vĩnh viễn (không đưa vào trash)
7. Đăng ký Route Mới (Custom REST Endpoint)
add_action('rest_api_init', function () {
register_rest_route('myplugin/v1', '/data', [
'methods' => 'GET',
'callback' => 'myplugin_get_data',
'permission_callback' => '__return_true'
]);
});
function myplugin_get_data(WP_REST_Request $request) {
return ['message' => 'Hello from custom API'];
}
- Namespace nên có version (v1, v2…) để dễ quản lý
8. REST Request Object
Trong callback, bạn nhận được đối tượng $request
:
function myplugin_callback(WP_REST_Request $request) {
$param = $request->get_param('id');
$all = $request->get_params();
$headers = $request->get_headers();
}
9. REST Response Object
Để trả về response tùy biến:
return new WP_REST_Response([
'success' => true,
'data' => [/* dữ liệu */]
], 200);
Hoặc lỗi:
return new WP_Error('api_error', 'Có lỗi xảy ra', ['status' => 400]);
10. Xác Thực (Authentication)
Basic Authentication (dev/test)
- Cài plugin Basic Auth
- Gửi header:
Authorization: Basic base64(username:password)
JWT Authentication (phổ biến cho SPA, mobile)
- Cài plugin JWT Auth
- Gửi POST để lấy token:
POST /wp-json/jwt-auth/v1/token
{
"username": "admin",
"password": "123456"
}
- Sau đó gửi:
Authorization: Bearer YOUR_TOKEN
11. Gọi REST API từ Theme/Plugin
$response = wp_remote_get('https://example.com/wp-json/wp/v2/posts');
$body = wp_remote_retrieve_body($response);
$data = json_decode($body, true);
wp_remote_post('https://example.com/wp-json/myplugin/v1/submit', [
'method' => 'POST',
'headers' => [
'Authorization' => 'Bearer YOUR_TOKEN',
'Content-Type' => 'application/json',
],
'body' => json_encode([
'field1' => 'value',
]),
]);
12. REST API và Nonce
Dùng khi gửi AJAX nội bộ từ theme/plugin:
fetch('/wp-json/myplugin/v1/action', {
method: 'POST',
headers: {
'X-WP-Nonce': my_script_data.nonce
},
body: JSON.stringify(data)
});
PHP:
'permission_callback' => function () {
return current_user_can('edit_posts');
}
13. Bảo vệ REST API (giới hạn quyền)
'permission_callback' => function (WP_REST_Request $request) {
return is_user_logged_in() && current_user_can('manage_options');
}
14. Disable REST API hoàn toàn (nếu cần)
add_filter('rest_authentication_errors', function ($result) {
if (!is_user_logged_in()) {
return new WP_Error('rest_disabled', 'REST API bị tắt với người dùng chưa login', ['status' => 403]);
}
return $result;
});
Thảo luận