禁用WP REST API的默认路由

时间:2017-03-13 06:32:28

标签: wordpress rest routes wp-api

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

我找到了this question,这有助于我找到以下答案。

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

但是,这也将删除任何自定义内容类型路由。所以   相反,你可以选择使用:

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

但是从这个方面来说,我需要知道所有默认路由并逐个删除,这不是最干净的方法。

我想知道是否有更清洁的方法来实现这一目标?

更新1:

根据克里斯的建议,我会添加更多详细信息。

目前,我正在使用rest_api_init过滤器,根据我在this article上找到的以下代码,使用register_rest_route方法添加自定义路由。

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过滤器注册新的自定义路由时取消设置/禁用默认路由?

4 个答案:

答案 0 :(得分:5)

这个问题已经接受了答案。但是,如果有人发现这有用。 我们可以轻松删除默认路由。在主题(子主题,如果有的话)functions.php或任何自定义插件中添加以下代码

add_filter('rest_endpoints', function( $endpoints ) {

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

    return $endpoints;
});

答案 1 :(得分:3)

根据另一个问题,这是目前唯一的“干净”方式。在Wordpress中处理事物的最简洁方法是使用过滤器和/或操作 - 这允许您与核心进行交互而无需在核心中进行更改

通过点击过滤器/操作,您还可以让其他插件在钩子之前/之后操作过滤器/操作参数。

如果您查看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 );

从我的研究中,这是修改(删除,更改或添加)端点的最后一个位置,并且是过滤器的确切目的。

作为旁注,你不需要“逐个” - 你可以只做$endpoints = []重新开始。

答案 2 :(得分:1)

REST API Toolbox为我做了这份工作。

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

enter image description here

答案 3 :(得分:0)

我最近不得不禁止在REST API中显示仅限成员的内容。我过滤了用于注册帖子类型的args,而不是过滤其余的端点:

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在get_post_types()中调用create_initial_rest_routes(),并查找show_in_rest设置为true的所有帖子类型。通过register_post_type_args中的过滤器register_post_type()过滤args,我们可以过滤这些路线,不会出现在API中。