本文目录导读:

我来详细介绍WordPress REST API和路由系统。
WordPress REST API 基础
什么是WordPress REST API
WordPress REST API是WordPress 4.7及以上版本内置的API,允许开发者通过HTTP请求与WordPress站点交互。
基础端点格式
https://yoursite.com/wp-json/wp/v2/{资源类型}
常用端点示例
// 获取文章列表
GET /wp/v2/posts
// 获取指定文章
GET /wp/v2/posts/{id}
// 创建文章 (需要认证)
POST /wp/v2/posts
// 获取页面
GET /wp/v2/pages
// 获取分类
GET /wp/v2/categories
// 获取标签
GET /wp/v2/tags
// 获取用户
GET /wp/v2/users
自定义路由/端点
注册自定义路由
// functions.php 或插件文件
add_action('rest_api_init', function() {
// 注册自定义路由
register_rest_route('myplugin/v1', '/data/', array(
'methods' => 'GET',
'callback' => 'myplugin_get_data',
'permission_callback' => '__return_true'
));
// 带参数的路由
register_rest_route('myplugin/v1', '/data/(?P<id>\d+)', array(
'methods' => 'GET',
'callback' => 'myplugin_get_single_data',
'args' => array(
'id' => array(
'validate_callback' => function($param) {
return is_numeric($param);
}
)
)
));
});
// 回调函数
function myplugin_get_data($request) {
return new WP_REST_Response(array(
'success' => true,
'data' => 'Hello from custom endpoint!'
), 200);
}
function myplugin_get_single_data($request) {
$id = $request->get_param('id');
return rest_ensure_response(array(
'id' => $id,
'content' => "Data for ID: $id"
));
}
REST API 认证方式
Cookie认证(用于插件和主题)
// 已登录用户自动启用
add_action('rest_api_init', function() {
if (is_user_logged_in()) {
// 自动处理认证
}
});
应用密码(WordPress 5.6+)
// 在用户设置中生成应用密码
// 使用Basic Auth
Authorization: Basic base64(username:app_password)
OAuth认证
// 使用OAuth插件
const fetch = require('node-fetch');
async function getData() {
const response = await fetch('https://yoursite.com/wp-json/wp/v2/posts', {
headers: {
'Authorization': 'Bearer ' + access_token
}
});
return response.json();
}
高级路由配置
带参数和验证的路由
add_action('rest_api_init', function() {
register_rest_route('custom/v1', '/products', array(
'methods' => 'GET',
'callback' => 'get_products',
'args' => array(
'category' => array(
'required' => false,
'sanitize_callback' => 'sanitize_text_field'
),
'price_range' => array(
'required' => false,
'validate_callback' => function($param) {
return preg_match('/^\d+-\d+$/', $param);
}
)
)
));
// POST路由(需要管理员权限)
register_rest_route('custom/v1', '/product', array(
'methods' => 'POST',
'callback' => 'create_product',
'permission_callback' => function() {
return current_user_can('manage_options');
}
));
});
function get_products($request) {
$args = array(
'post_type' => 'product',
'posts_per_page' => 10
);
if ($request->get_param('category')) {
$args['tax_query'] = array(
array(
'taxonomy' => 'category',
'field' => 'slug',
'terms' => $request->get_param('category')
)
);
}
$products = get_posts($args);
return rest_ensure_response($products);
}
REST API 客户端使用
JavaScript/jQuery
// GET请求
$.ajax({
url: 'https://yoursite.com/wp-json/wp/v2/posts',
method: 'GET',
data: {
per_page: 5,
categories: 1
},
success: function(response) {
console.log(response);
}
});
// POST请求(需要认证)
$.ajax({
url: 'https://yoursite.com/wp-json/wp/v2/posts',
method: 'POST',
data: {
title: 'New Post',
content: 'Post content',
status: 'publish'
},
beforeSend: function(xhr) {
xhr.setRequestHeader('X-WP-Nonce', wpApiSettings.nonce);
}
});
React/Next.js
// 使用WordPress REST API
import { useEffect, useState } from 'react';
function Posts() {
const [posts, setPosts] = useState([]);
useEffect(() => {
fetch('https://yoursite.com/wp-json/wp/v2/posts')
.then(res => res.json())
.then(data => setPosts(data));
}, []);
return (
<div>
{posts.map(post => (
<article key={post.id}>
<h2 dangerouslySetInnerHTML={{__html: post.title.rendered}} />
<div dangerouslySetInnerHTML={{__html: post.excerpt.rendered}} />
</article>
))}
</div>
);
}
自定义路由参数
// 更复杂的路由配置
register_rest_route('myapp/v1', '/search', array(
'methods' => 'GET',
'callback' => 'custom_search',
'args' => array(
'q' => array(
'required' => true,
'sanitize_callback' => 'sanitize_text_field'
),
'type' => array(
'default' => 'post',
'enum' => array('post', 'page', 'product')
),
'page' => array(
'default' => 1,
'sanitize_callback' => 'absint'
),
'per_page' => array(
'default' => 10,
'maximum' => 100
)
)
));
function custom_search($request) {
$query = $request->get_param('q');
$type = $request->get_param('type');
$page = $request->get_param('page');
$search_results = new WP_Query(array(
's' => $query,
'post_type' => $type,
'paged' => $page,
'posts_per_page' => 10
));
$data = array();
foreach ($search_results->posts as $post) {
$data[] = array(
'id' => $post->ID,
'title' => $post->post_title,
'excerpt' => $post->post_excerpt,
'link' => get_permalink($post->ID)
);
}
return rest_ensure_response(array(
'results' => $data,
'total' => $search_results->found_posts,
'pages' => $search_results->max_num_pages
));
}
路由调试工具
// 列出所有注册的路由
add_action('rest_api_init', function() {
$routes = rest_get_server()->get_routes();
error_log('Registered Routes: ' . print_r($routes, true));
});
// 检查特定路由
function check_route($route) {
$server = rest_get_server();
$routes = $server->get_routes();
if (isset($routes[$route])) {
return $routes[$route];
}
return false;
}
WordPress REST API提供了强大的数据交互能力,适用于前后端分离开发、移动应用支持、第三方集成等场景,合理的路由设计可以提高API的可用性和可维护性。