禁用 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 的默认路由的主要内容,如果未能解决你的问题,请参考以下文章