1. Webhook là gì và khi nào cần?
Webhook là một đoạn URL mà hệ thống khác có thể gửi dữ liệu đến (thường qua phương thức POST) khi có sự kiện xảy ra, ví dụ như:
- Khi có bài viết mới trên site A → gọi webhook trên site B để lấy về và hiển thị lại.
- Khi người dùng đăng ký trên một site → gọi webhook tạo tài khoản tương ứng ở site khác.
Lưu ý: Webhook nội bộ vẫn là HTTP request, nhưng thường là trong cùng hệ thống hoặc đã xác định danh tính.
2. Tạo endpoint webhook trong WordPress
Thêm đoạn sau vào functions.php để tạo endpoint nhận dữ liệu:
// Ví dụ: https://yoursite.com/wp-json/internal/v1/webhook
add_action('rest_api_init', function () {
register_rest_route('internal/v1', '/webhook', [
'methods' => 'POST',
'callback' => 'handle_internal_webhook',
'permission_callback' => '__return_true',
]);
});
function handle_internal_webhook(WP_REST_Request $request) {
$data = $request->get_json_params();
// Kiểm tra token nội bộ để tránh lạm dụng
if ($data['token'] !== 'your_internal_token') {
return new WP_REST_Response(['message' => 'Unauthorized'], 403);
}
// Xử lý dữ liệu nhận được
// Ví dụ: ghi log, tạo bài viết, cập nhật user...
return new WP_REST_Response(['message' => 'Webhook received'], 200);
}
3. Gửi dữ liệu đến webhook
Ở site gửi dữ liệu (ví dụ trong save_post):
function notify_other_site($post_ID) {
$post = get_post($post_ID);
if ($post->post_status !== 'publish') return;
wp_remote_post('https://othersite.com/wp-json/internal/v1/webhook', [
'headers' => ['Content-Type' => 'application/json'],
'body' => json_encode([
'token' => 'your_internal_token',
'post_id' => $post->ID,
'title' => $post->post_title,
'content' => $post->post_content
])
]);
}
add_action('publish_post', 'notify_other_site');
4. Lưu ý bảo mật
- Luôn dùng token (hoặc JWT/OAuth nếu cần cao hơn) để xác thực request.
- Giới hạn IP nội bộ hoặc dùng VPN để tăng bảo mật.
- Ghi log request để debug dễ dàng.
5. Ứng dụng thực tế
- Đồng bộ sản phẩm giữa nhiều site bán hàng.
- Gửi thông báo từ site chính đến microsite vệ tinh.
- Kết nối trang blog với hệ thống diễn đàn hoặc tài liệu.
Mẹo hay: Bạn có thể dùng
set_transient()để tạm lưu các request và xử lý chúng sau bằng cron nếu không muốn xử lý realtime.
Kết luận
Webhook nội bộ giúp bạn xây dựng một hệ thống WordPress linh hoạt, có thể phản hồi nhanh chóng mà không cần các plugin nặng nề. Khi dùng đúng cách, nó là một giải pháp tuyệt vời để kết nối dữ liệu giữa các site một cách hiệu quả và an toàn.
Bình luận