PRE_GET_POST是否会影响REST API响应?

时间:2019-03-15 作者:Rick Curran

我试图将通过REST API路由返回的内容限制为仅包含当前登录用户发布的内容。我正在尝试使用pre_get_posts 在admin视图中工作正常,但REST API输出仍然包含所有帖子。

在这种情况下,我试图通过自定义帖子类型的REST路由来实现这一点,因此路由是/wp-json/wp/v2/todos/. 默认情况下,访问此路线可以正常工作,并返回所有帖子,但pre_get_posts 代码到位它仍然总是返回所有帖子。这是我的pre_get_posts 代码:

function only_users_todos( $query ) {
    global $user_ID;
    $query->set( \'author\', $user_ID );
    return $query;
}
add_filter( \'pre_get_posts\', \'only_users_todos\' );
我是不是错过了什么明显的东西pre_get_posts 只是没有为REST API请求调用?

1 个回复
最合适的回答,由SO网友:Jacob Peattie 整理而成

pre_get_posts 运行REST API请求。您的问题可能是您的请求没有经过正确的身份验证,因此$user_ID 未设置。要允许REST API识别登录的用户,您需要发送wp_rest 请求的nonce。您可以使用wp_create_nonce( \'wp_rest\' ) 并将其与请求一起作为X-WP-Nonce 标题。这是documented 有关详细信息,请参阅《开发人员手册》。

这与原始问题无关,但问题中的代码将应用于所有查询。这包括帖子、页面、菜单等。因此,如果您不希望出现这种行为,则需要添加某种检查,以便您的代码仅适用于某些查询。例如:

function only_users_todos( $query ) {
    if ( $query->get( \'post_type\' ) === \'todo\' ) {
        $query->set( \'author\', get_current_user_id() );
    }
}
add_action( \'pre_get_posts\', \'only_users_todos\' );
此外,pre_get_posts 是一个操作,而不是筛选器,因此不需要返回$query.