禁用 WP REST API 的默认路由

Posted

技术标签:

【中文标题】禁用 WP REST API 的默认路由【英文标题】:Disable default routes of WP REST API 【发布时间】:2017-08-03 02:53:30 【问题描述】:

我需要禁用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:

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

【问题讨论】:

供将来参考:初始问题与 UPDATE 1 有所不同。初始问题上的代码将不适用于 rest_api_init 过滤器。 @Chris 回答了最初的问题,然后我对其进行了一些更改,因此他将获得赏金。但是如果有人在寻找UPDATE 1 的答案,请参考我自己的答案。 【参考方案1】:

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

add_filter('rest_endpoints', function( $endpoints ) 

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

    return $endpoints;
);

【讨论】:

【参考方案2】:

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

通过使用过滤器/动作,您还可以让其他插件有机会在您的钩子之前/之后对过滤器/动作参数进行操作。

如果您查看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 = [] 即可重新开始。

【讨论】:

我仍然对如何以及在何处使用rest_endpoints 过滤器感到困惑。因为我已经在使用rest_api_init 过滤器来添加我的自定义路由。但是,当我使用rest_endpoints 清除默认路由时,它会清除包括自定义在内的所有路由。 如果您在rest_endpoints 过滤器中转储并死掉,您看不到自己的自定义路由吗? 是的。但我认为我在错误的地方或错误的方式使用它。我在 wordpress 上很糟糕。 顺便说一句,我正在使用register_rest_route方法注册自定义路由 也许发布您在问题中的所有内容(所有与休息相关的内容),以便人们可以更好地帮助您【参考方案3】:

REST API Toolbox 为我完成了这项工作。

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

【讨论】:

这并不能真正回答您自己的问题?您要求一种方法来逐一进行 - 这个插件只是禁用所有?还是我错过了什么 当我添加这个问题时,我认为您在其他问题中提供的代码将有助于至少一一禁用默认路由。但是当使用rest_api_init 创建自定义路由时,它并没有像我预期的那样工作。但是我没有很好地解释这个问题。我的错。实际上我需要在使用 rest_api_init 时禁用默认路由。希望我现在足够清楚。但是,是的,我同意,这在问题中描述得不够好。 @Chris 不,我需要全部禁用 啊,好吧,我误解了-您问题中的“一个接一个”行让我感到震惊。我很高兴您找到了答案的解决方案【参考方案4】:

我最近不得不禁止会员专享内容出现在 REST API 中。我没有过滤其余端点,而是过滤了用于注册帖子类型的参数:

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 的任何帖子类型。通过过滤器过滤参数:register_post_type_args in register_post_type(),我们可以过滤这些路由,使其不显示在 API 中。

【讨论】:

以上是关于禁用 WP REST API 的默认路由的主要内容,如果未能解决你的问题,请参考以下文章

php 禁用JSON WP Rest API

Laravel5.2默认会给路由增加Web中间件,怎么禁用掉

web api 项目的默认路由

WebApi路由

Matrix路由API和流量条件

Web API之路由浅谈