WordPress中文开发手册

经常问的问题

此页面提供了解使用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