16 REST API 与 AJAX

整理 admin-ajax、REST 路由、权限回调、nonce 和前端请求场景。

16 REST API 与 AJAX

本页关键词

REST API register_rest_route admin-ajax permission_callback nonce

学习目标

代码使用提醒

本页代码适合用于学习和研究。复制到正式网站前,请先备份,并优先在测试环境验证。

涉及用户输入、后台保存、接口请求、删除操作和邮件发送时,要同时考虑权限、nonce、sanitize、validate 和 escape。

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 更适合结构化数据接口。

本页总结

AJAX 和 REST 都能处理异步请求。admin-ajax 更传统,REST 更适合结构化接口;二者都必须重视 nonce、权限和数据处理。