此页面提供了解使用API时可能出现的常见问题和问题的解决方案。 如果您的问题在这里没有解释,可能已经在WordPress支持论坛中得到回答。
我可以禁用REST API吗?
您不应该禁用REST API,因为这样做会破坏将取决于API处于活动状态的未来WordPress管理功能。 但是,您可以使用过滤器来要求API消费者进行身份验证,从而有效防止匿名外部访问。 有关详细信息,请参阅下文。
需要所有Requests的身份验证
您可以通过向rest_authentication_errors过滤器添加is_user_logged_in检查来要求对所有REST API请求进行身份验证:
add_filter( 'rest_authentication_errors', function( $result ) {
if ( ! empty( $result ) ) {
return $result;
}
if ( ! is_user_logged_in() ) {
return new WP_Error( 'rest_not_logged_in', 'You are not currently logged in.', array( 'status' => 401 ) );
}
return $result;
});
我可以在插件中从PHP发出API请求吗?
是的你可以! 在其他WordPress代码内部使用rest_do_request来制作API请求:
$request = new WP_REST_Request( 'GET', '/wp/v2/posts' );
// Set one or more request query parameters
$request->set_param( 'per_page', 20 );
$response = rest_do_request( $request );
?filter =查询参数发生了什么?
当REST API合并到WordPress核心中时,过滤器查询参数被删除,以防止将来的兼容性和维护问题。 在REST API项目的起源上,使用?filter查询参数传递任意WP_Query参数到API的功能是必要的,但大多数API响应过滤功能已经被更强大的查询参数所取代,如?categories =,?slug =和 ?per_page =。
应尽可能使用第一方查询参数。 但是,如果需要,其余的过滤器插件可以恢复在API请求中传递任意的过滤器值的功能。
查询参数不起作用
如果您发现诸如?page = 2或?_embed的查询参数没有任何影响,您的服务器可能没有被正确配置来检测它们。 如果您使用Nginx来为您的网站提供服务,请在您的网站配置中查找一个try_files行。 如果看起来像这样:
try_files $uri $uri/ /index.php$args;
改为:
try_files $uri $uri/ /index.php$is_args$args;
添加$ is_args(如果找到查询参数,将打印一个字符)将允许WordPress正确接收和解释查询参数。
为什么验证不起作用?
如果您发现您正在发送身份验证标头,但请求未被接受,并且您在CGI环境中使用Apache,则Apache可能会剥离头文件。 尝试将其添加到配置文件或.htaccess中:
SetEnvIf Authorization "(.*)" HTTP_AUTHORIZATION=$1