禁用 WP REST API 的默认路由

问题描述 投票:0回答:5

我需要禁用

WP REST API
的默认路由并添加自定义路由。

我发现了这个问题,这帮助我找到以下答案。

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

wordpress rest routes wp-api
5个回答
11
投票

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

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

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

    return $endpoints;
});

6
投票

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

other

插件提供在钩子之前/之后对过滤器/操作参数进行操作的机会。 如果您查看

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 = []即可重新开始。

    


1
投票
REST API Toolbox

为我完成了这项工作。 我们可以通过该插件处理很多事情。

enter image description here


0
投票

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()
,我们可以过滤这些路由,使其不显示在API中。
    


0
投票

add_filter( 'rest_endpoints', function ( $endpoints ) { $routes_to_remove = [ '/wp/', '/oembed/', '/wp-site-health/', '/wp-block-editor/', ]; foreach ( $endpoints as $route => $endpoint ) { foreach ( $routes_to_remove as $pattern ) { if ( 0 === stripos( $route, $pattern ) ) { unset( $endpoints[$route] ); break; } } } return $endpoints; } );

	
© www.soinside.com 2019 - 2024. All rights reserved.