禁用 WP REST 的默认路由 API

Disable default routes of WP REST API

我需要禁用 WP REST API 的默认路由并添加自定义路由。

我发现 这有助于我找到以下答案。

remove_action('rest_api_init', 'create_initial_rest_routes', 99);

However this will also remove any custom content type routes. So instead you may choose to use:

add_filter('rest_endpoints', function($endpoints) {
    if ( isset( $endpoints['/wp/v2/users'] ) ) {
        unset( $endpoints['/wp/v2/users'] );
    }
    // etc
});

但是通过这种方式我需要知道所有默认路由并逐一删除这不是最干净的方法。

我想知道是否有更简洁的方法来实现这一点?

更新 1:

根据 Chris 的建议,我会在问题中添加更多细节。

目前我正在使用 rest_api_init 过滤器通过使用 register_rest_route 方法添加我的自定义路由,按照我在 this article.

上找到的以下代码
add_action( 'rest_api_init', function () {
  register_rest_route( 'myplugin/v1', '/sample/', array(
    'methods' => 'GET',
    'callback' => 'my_awesome_func',
  ) );
} );

function my_awesome_func( $data ) {
  return 'somthing';
}

自定义路由效果很好,但不幸的是我无法禁用默认路由,例如/wp/v2/posts

我的问题:

如何在使用 rest_api_init 过滤器注册新自定义路由时 unset/disable 默认路由?

根据另一个问题,这是目前唯一的 "clean" 方法。在 Wordpress 中处理事物的最干净的方法是使用过滤器 and/or 操作 - 这允许您与核心交互而无需更改 in 核心。

通过利用 filters/actions,您还为 其他 插件提供了对 filter/action 参数进行操作的机会 before/after 您的钩子。

如果您查看 class-wp-rest-server.php,您可以轻松查看与休息相关的所有可用过滤器和操作。

你会特别注意到这个:

    /**
     * Filters the array of available endpoints.
     *
     * @since 4.4.0
     *
     * @param array $endpoints The available endpoints. An array of matching regex patterns, each mapped
     *                         to an array of callbacks for the endpoint. These take the format
     *                         `'/path/regex' => array( $callback, $bitmask )` or
     *                         `'/path/regex' => array( array( $callback, $bitmask ).
     */
    $endpoints = apply_filters( 'rest_endpoints', $this->endpoints );

根据我的研究,这是修改(删除、更改或添加)端点的最后一个位置,也是过滤器的确切用途。

作为旁注,您不需要这样做 "one by one" - 您 可以 只需 $endpoints = [] 重新开始。

REST API Toolbox 为我完成了工作。

我们可以通过那个插件处理很多事情。

这个问题已经接受了答案。但如果有人觉得这有用。 我们可以轻松删除默认路由。在您的主题(如果有子主题)functions.php 或任何自定义插件

中添加以下代码
add_filter('rest_endpoints', function( $endpoints ) {

    foreach( $endpoints as $route => $endpoint ){
        if( 0 === stripos( $route, '/wp/' ) ){
            unset( $endpoints[ $route ] );
        }
    }

    return $endpoints;
});

我最近不得不禁止 member-only 内容出现在 REST API 中。我没有过滤其余端点,而是过滤了用于注册 post 类型的参数:

function dbdb_unset_rest_routes( $args, $post_type ) {
    $allowed_post_types = array( 'page', 'post', 'company', 'job' );
    $allowed_post_types = apply_filters( 'dbdb_unset_rest_routes_types', $allowed_post_types );
    if( in_array( $post_type, $allowed_post_types ) ){
        return $args;
    } else {
         $args['show_in_rest'] = 0;
    }
    return $args;
}
add_filter( 'register_post_type_args', 'dbdb_unset_rest_routes', 20, 2 );

REST API 在 create_initial_rest_routes() 中调用 get_post_types() 并查找 show_in_rest 设置为 true 的任何 post 类型。通过过滤器过滤 args:register_post_type_args in register_post_type(),我们可以过滤这些路由,使其不显示在 API.