1. admin-ajax 基础回调
基础
<?php
function mysite_ajax_get_message() {
check_ajax_referer( 'mysite_ajax_nonce', 'nonce' );
wp_send_json_success( array(
'message' => 'Hello from WordPress AJAX.',
) );
}
add_action( 'wp_ajax_mysite_get_message', 'mysite_ajax_get_message' );
add_action( 'wp_ajax_nopriv_mysite_get_message', 'mysite_ajax_get_message' );
admin-ajax 适合传统 WordPress AJAX。
2. 前端 fetch 请求 admin-ajax
前端
fetch(mysiteAjax.ajaxUrl, {
method: 'POST',
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
body: new URLSearchParams({
action: 'mysite_get_message',
nonce: mysiteAjax.nonce
})
})
.then(response => response.json())
.then(data => console.log(data));
ajaxUrl 和 nonce 可通过 wp_localize_script 传递。
3. 注册 REST API 路由
进阶
<?php
function mysite_register_rest_routes() {
register_rest_route( 'mysite/v1', '/products', array(
'methods' => 'GET',
'callback' => 'mysite_rest_get_products',
'permission_callback' => '__return_true',
) );
}
add_action( 'rest_api_init', 'mysite_register_rest_routes' );
function mysite_rest_get_products() {
return rest_ensure_response( array(
'items' => array(
array( 'title' => 'Product 01' ),
),
) );
}
公开 GET 接口可以 permission_callback 为 __return_true。
4. REST 权限控制
安全
<?php
register_rest_route( 'mysite/v1', '/settings', array(
'methods' => 'POST',
'callback' => 'mysite_rest_save_settings',
'permission_callback' => function () {
return current_user_can( 'manage_options' );
},
) );
修改数据的 REST 接口必须有权限控制。
5. REST 参数清理
安全
<?php
function mysite_rest_save_settings( WP_REST_Request $request ) {
$phone = sanitize_text_field( $request->get_param( 'phone' ) );
update_option( 'mysite_phone', $phone );
return rest_ensure_response( array(
'success' => true,
) );
}
REST 请求参数也需要 sanitize/validate。
6. 前端请求 REST API
前端
fetch('/wp-json/mysite/v1/products')
.then(response => response.json())
.then(data => {
console.log(data.items);
});
REST API 更适合结构化数据接口。