WordPress REST API与路由

wen PHP项目 1

本文目录导读:

WordPress REST API与路由

  1. WordPress REST API 基础
  2. 自定义路由/端点
  3. REST API 认证方式
  4. 高级路由配置
  5. REST API 客户端使用
  6. 自定义路由参数
  7. 路由调试工具

我来详细介绍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的可用性和可维护性。

抱歉,评论功能暂时关闭!