阐述 WordPress `rest_get_all_endpoints()` 函数的源码:如何获取所有注册的 REST API 端点。

好家伙,各位观众老爷们,今天咱们来聊聊 WordPress 里面的一个“老司机”函数:rest_get_all_endpoints()。 这货可是个宝,能帮你把 WordPress 注册的所有 REST API 端点都扒出来,就像警察蜀黍查户口一样,一个都跑不了。

咱们今天就来解剖一下这个函数,看看它到底是怎么做到的。 准备好了吗? Let’s dive in!

开场白:REST API 的江湖地位

在深入源码之前,咱们先来简单回顾一下 REST API 在 WordPress 世界里的地位。 简单来说,REST API 就是 WordPress 开放给外部世界的一扇扇窗户。通过这些窗户,你可以用 HTTP 请求的方式来获取和操作 WordPress 的数据,比如文章、页面、用户等等。 这就使得 WordPress 不仅仅是一个博客系统,更是一个强大的内容管理平台,可以和其他应用无缝集成。

而要玩转 REST API,首先你得知道有哪些端点可用。 这就是 rest_get_all_endpoints() 函数的用武之地了。

rest_get_all_endpoints() 函数:你的 REST API 地图

这个函数的作用很简单,就是返回一个包含所有注册的 REST API 端点的数组。 每个端点都包含了它的路由(route)和对应的处理函数(handler)。

源码剖析:一步一步揭秘

好了,废话不多说,直接上代码! 我们来看看 rest_get_all_endpoints() 函数的源码(基于 WordPress 最新版本 6.4):

/**
 * Gets all registered REST API routes.
 *
 * @since 4.7.0
 *
 * @global WP_REST_Server $wp_rest_server REST server instance.
 *
 * @return array Registered routes mapped to handlers.
 */
function rest_get_all_endpoints() {
    global $wp_rest_server;

    if ( empty( $wp_rest_server ) ) {
        return array();
    }

    return $wp_rest_server->get_routes();
}

是不是短得让你怀疑人生? 别急,精华都在里面了。 咱们来一行一行地分析:

  1. function rest_get_all_endpoints() {: 定义函数,没啥好说的。

  2. global $wp_rest_server;: 这行代码很重要! 它声明了一个全局变量 $wp_rest_server。 这个变量是 WP_REST_Server 类的实例,负责处理所有的 REST API 请求。 你可以把它想象成一个 REST API 的总指挥官。

  3. if ( empty( $wp_rest_server ) ) { return array(); }: 这个判断也很关键。 它检查 $wp_rest_server 是否为空。 如果为空,说明 REST API 还没有初始化,那就直接返回一个空数组。

  4. return $wp_rest_server->get_routes();: 这才是真正的核心! 它调用了 $wp_rest_server 对象的 get_routes() 方法,获取所有注册的路由。 然后把这些路由以数组的形式返回。

WP_REST_Server::get_routes():背后的英雄

rest_get_all_endpoints() 函数本身很简单,真正的功劳要归功于 WP_REST_Server::get_routes() 方法。 咱们来看看这个方法是怎么实现的。

/**
 * Retrieves all registered routes.
 *
 * @since 4.4.0
 *
 * @return array Registered routes mapped to handlers.
 */
public function get_routes() {
    return $this->endpoints;
}

更短了! 是不是觉得被耍了? 其实不然。 关键在于 $this->endpoints 这个变量。 它是一个数组,存储了所有注册的 REST API 端点。 get_routes() 方法只是简单地把这个数组返回而已。

$this->endpoints:端点的仓库

那么,$this->endpoints 这个变量是怎么填充的呢? 答案就在 WP_REST_Server::register_route() 方法里。 这个方法负责注册新的 REST API 路由。 每当调用 register_rest_route() 函数注册一个新的路由时,WP_REST_Server::register_route() 就会被调用,把新的路由信息添加到 $this->endpoints 数组中。

register_rest_route():注册路由的功臣

register_rest_route() 函数是 WordPress 提供的用于注册 REST API 路由的函数。 它的用法如下:

register_rest_route( string $namespace, string $route, array $args = array(), bool $override = false )
  • $namespace: 命名空间,用于区分不同的 API。 比如 wp/v2 是 WordPress 核心的 API,my-plugin/v1 是你的插件的 API。
  • $route: 路由,就是 URL 的一部分。 比如 /posts/users 等等。
  • $args: 参数,定义了请求的方法(GET、POST、PUT、DELETE 等等)、回调函数、权限验证等等。
  • $override: 是否覆盖已存在的路由。

代码示例:注册一个简单的 REST API 端点

为了更好地理解,咱们来看一个简单的例子。 假设你要注册一个 REST API 端点,用于获取当前时间。 你可以在你的插件或主题的 functions.php 文件中添加以下代码:

add_action( 'rest_api_init', function () {
    register_rest_route( 'my-plugin/v1', '/time', array(
        'methods'  => 'GET',
        'callback' => 'my_plugin_get_time',
    ) );
} );

function my_plugin_get_time( WP_REST_Request $request ) {
    return date( 'Y-m-d H:i:s' );
}

这段代码做了以下几件事:

  1. add_action( 'rest_api_init', function () { ... } );: 在 rest_api_init 钩子上注册一个函数。 这个钩子在 REST API 初始化时触发。

  2. register_rest_route( 'my-plugin/v1', '/time', array( ... ) );: 注册一个 REST API 路由。

    • 'my-plugin/v1' 是命名空间。
    • '/time' 是路由。
    • 'methods' => 'GET' 指定请求方法为 GET。
    • 'callback' => 'my_plugin_get_time' 指定回调函数为 my_plugin_get_time()
  3. function my_plugin_get_time( WP_REST_Request $request ) { ... }: 定义回调函数。 这个函数返回当前时间。

现在,你可以通过访问 your-website.com/wp-json/my-plugin/v1/time 来获取当前时间了。

如何使用 rest_get_all_endpoints() 函数

了解了 rest_get_all_endpoints() 函数的原理,接下来咱们来看看如何使用它。 你可以在你的插件或主题的 functions.php 文件中添加以下代码:

$endpoints = rest_get_all_endpoints();

echo '<pre>';
print_r( $endpoints );
echo '</pre>';

这段代码会把所有注册的 REST API 端点打印出来。 你可以在浏览器中查看输出结果。

rest_get_all_endpoints() 返回的数据结构

rest_get_all_endpoints() 函数返回的是一个数组,数组的键是路由,值是一个包含路由信息的数组。 每个路由信息的数组包含了以下键:

namespace 命名空间。
methods 允许的 HTTP 请求方法。 例如 GETPOSTPUTDELETE 等等。
callback 处理请求的回调函数。
permission_callback 权限验证回调函数。 用于检查用户是否有权限访问该端点。
args 参数定义。 用于定义请求参数的类型、描述、是否必须等等。

实际应用:打造 REST API 工具箱

rest_get_all_endpoints() 函数在实际开发中有很多用途。 比如:

  • 构建 REST API 文档: 你可以使用这个函数来自动生成 REST API 文档,方便开发者了解你的 API。
  • 开发 REST API 调试工具: 你可以使用这个函数来开发一个 REST API 调试工具,方便你测试和调试你的 API。
  • 动态生成 API 客户端: 你可以使用这个函数来动态生成 API 客户端代码,方便你与其他应用集成。

注意事项

  • rest_get_all_endpoints() 函数只能获取已经注册的 REST API 端点。 如果你的端点没有正确注册,它就不会被返回。
  • rest_get_all_endpoints() 函数返回的是一个数组,数组的结构可能会随着 WordPress 版本的更新而发生变化。 因此,在使用这个函数时,最好做好兼容性处理。

总结

rest_get_all_endpoints() 函数是 WordPress REST API 的一个重要组成部分。 它可以帮助你获取所有注册的 REST API 端点,方便你了解和使用 REST API。 希望今天的讲解能够帮助你更好地理解这个函数,并在实际开发中灵活运用它。

好了,今天的讲座就到这里。 感谢各位观众老爷的耐心观看! 记住,多写代码,多实践,才能真正掌握 WordPress REST API 的精髓! 咱们下次再见!

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注