Đăng nhập

WordPress AJAX Cheatsheet (Nâng cao)

Dưới đây là bản WordPress AJAX Cheatsheet nâng cao, dành cho lập trình viên muốn thực hiện xử lý bất đồng bộ (AJAX) giữa frontend và backend trong theme/plugin WordPress một cách đúng chuẩn, bảo mật và hiệu quả.


1. Cơ chế hoạt động của AJAX trong WordPress

  • AJAX request được gửi tới:
    /wp-admin/admin-ajax.php
  • WordPress xử lý request dựa vào action và hook wp_ajax_{action} hoặc wp_ajax_nopriv_{action}
  • AJAX có thể dùng cả ở frontend (client) lẫn admin (backend)

2. Gửi AJAX từ JavaScript (fetch)

fetch(ajaxurl, {
  method: 'POST',
  headers: {
    'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'
  },
  body: new URLSearchParams({
    action: 'my_ajax_action',
    security: my_script_data.nonce,
    name: 'Johnny'
  })
})
.then(res => res.json())
.then(data => console.log(data));

3. Khai báo biến ajaxurlnonce từ PHP

add_action('wp_enqueue_scripts', 'my_enqueue_script');
function my_enqueue_script() {
    wp_enqueue_script('my-ajax', get_template_directory_uri() . '/js/my-ajax.js', ['jquery'], null, true);
    
    wp_localize_script('my-ajax', 'my_script_data', [
        'ajaxurl' => admin_url('admin-ajax.php'),
        'nonce' => wp_create_nonce('my_ajax_nonce')
    ]);
}

4. Xử lý AJAX ở PHP

add_action('wp_ajax_my_ajax_action', 'handle_my_ajax');
add_action('wp_ajax_nopriv_my_ajax_action', 'handle_my_ajax'); // Cho user chưa login

function handle_my_ajax() {
    check_ajax_referer('my_ajax_nonce', 'security');

    $name = sanitize_text_field($_POST['name']);

    wp_send_json_success([
        'message' => "Xin chào $name!"
    ]);

    wp_die();
}

5. Sử dụng jQuery AJAX (cũ nhưng vẫn phổ biến)

jQuery.post(my_script_data.ajaxurl, {
    action: 'my_ajax_action',
    security: my_script_data.nonce,
    name: 'Johnny'
}, function(response) {
    if (response.success) {
        alert(response.data.message);
    }
});

6. AJAX từ trang admin

  • Có thể dùng cùng admin-ajax.php, không cần wp_ajax_nopriv
  • Vẫn nên tạo nonce riêng và truyền qua admin_enqueue_scripts

7. AJAX trong shortcode, widget, template

Chỉ cần bạn gọi wp_localize_script() và truyền biến nonce + ajaxurl, bạn có thể gửi từ bất kỳ nơi nào ở frontend.


8. Trả kết quả dạng JSON

wp_send_json_success(['key' => 'value']); // Status 200
wp_send_json_error(['error' => 'Something went wrong']); // Status 400

Hoặc trả thô:

echo json_encode(['status' => 'ok']);
wp_die();

9. AJAX Upload File

const formData = new FormData();
formData.append('action', 'upload_file');
formData.append('security', my_script_data.nonce);
formData.append('file', fileInput.files[0]);

fetch(my_script_data.ajaxurl, {
  method: 'POST',
  body: formData
})
.then(res => res.json())
.then(result => console.log(result));

PHP:

add_action('wp_ajax_upload_file', 'handle_upload');
function handle_upload() {
    check_ajax_referer('my_ajax_nonce', 'security');

    if (!empty($_FILES['file']['name'])) {
        $upload = wp_handle_upload($_FILES['file'], ['test_form' => false]);
        if (!isset($upload['error'])) {
            wp_send_json_success(['url' => $upload['url']]);
        }
    }

    wp_send_json_error(['error' => 'Upload thất bại']);
}

10. Best Practices

  • Luôn dùng check_ajax_referer() để bảo vệ
  • Sử dụng sanitize_text_field()esc_* functions để lọc input
  • Luôn gọi wp_die() để kết thúc request
  • Trả về JSON rõ ràng, dễ debug
  • Sử dụng wp_localize_script() hoặc wp_add_inline_script() để truyền biến từ PHP sang JS

11. AJAX trong block editor (Gutenberg)

Khi dùng @wordpress/api-fetch, bạn có thể gọi API tương tự:

import apiFetch from '@wordpress/api-fetch';

apiFetch({
  path: '/wp-admin/admin-ajax.php',
  method: 'POST',
  data: {
    action: 'my_ajax_action',
    security: my_script_data.nonce
  }
}).then(response => {
  console.log(response);
});

12. Các hook AJAX liên quan

HookMô tả
wp_ajax_{action}Cho người dùng đã đăng nhập
wp_ajax_nopriv_{action}Cho khách (chưa đăng nhập)
admin_enqueue_scriptsGắn JS vào admin
wp_enqueue_scriptsGắn JS vào frontend

13. Debug AJAX

  • Mở tab Network → Xem request tới admin-ajax.php
  • Kiểm tra response, status code, headers
  • Bật WP_DEBUG và WP_DEBUG_LOG trong wp-config.php
  • Dùng error_log() trong hàm xử lý để ghi lỗi vào wp-content/debug.log

Thảo luận

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *

Đăng ký nhận tin mới

Nhận bài học, tài nguyên và cơ hội việc làm qua email hàng tuần.

Chúng tôi cam kết không spam. Bạn có thể hủy bất cứ lúc nào.