如何在不关闭REST API的情况下禁用其页面名称查看功能?
解决方案
1. 过滤REST API页面查询结果
通过rest_post_query钩子,在API查询页面时仅返回当前用户有权访问的内容,彻底屏蔽无权页面的暴露:
add_filter( 'rest_post_query', 'restrict_membership_pages_rest_api', 10, 2 ); function restrict_membership_pages_rest_api( $args, $request ) { // 仅对pages端点生效 if ( $request->get_route() !== '/wp/v2/pages' ) { return $args; } // 未登录用户直接返回空结果 if ( ! is_user_logged_in() ) { $args['post__in'] = array(0); return $args; } $current_user = wp_get_current_user(); // 获取当前用户可访问的所有页面ID(依赖WooCommerce Memberships内置函数) $accessible_pages = wc_memberships_get_user_accessible_post_ids( $current_user->ID, 'page' ); // 无权限页面则返回空 if ( empty( $accessible_pages ) ) { $args['post__in'] = array(0); return $args; } // 限制查询结果为用户可访问页面 $args['post__in'] = $accessible_pages; return $args; }
2. 移除敏感字段或返回权限错误
如果仅需阻止link字段泄露,可使用rest_prepare_page钩子,对无权访问的页面移除字段或返回403错误:
add_filter( 'rest_prepare_page', 'remove_link_from_rest_pages', 10, 2 ); function remove_link_from_rest_pages( $response, $post ) { // 检查当前用户是否有权访问该页面 if ( ! wc_memberships_user_can_access_post( get_current_user_id(), $post->ID ) ) { // 方式1:移除link字段 unset( $response->data['link'] ); // 方式2:直接返回权限错误(二选一) // return new WP_Error( 'rest_forbidden', '无权访问此内容', array( 'status' => 403 ) ); } return $response; }
3. 拦截特定恶意请求
针对用户使用_fields=link参数批量获取链接的场景,直接拦截该类型请求:
add_action( 'rest_api_init', 'block_link_fields_request' ); function block_link_fields_request() { add_filter( 'rest_request_before_callbacks', function( $response, $handler, $request ) { // 匹配pages端点且请求link字段的情况 if ( $request->get_route() === '/wp/v2/pages' && isset( $request['_fields'] ) && strpos( $request['_fields'], 'link' ) !== false ) { // 仅允许会员用户访问 if ( ! is_user_logged_in() || ! wc_memberships_user_has_active_membership( get_current_user_id() ) ) { return new WP_Error( 'rest_forbidden', '无权获取此信息', array( 'status' => 403 ) ); } } return $response; }, 10, 3 ); }
注意事项
- 将代码添加到主题的
functions.php文件或自定义插件中,避免主题更新丢失。 - 测试时使用非会员账号或退出登录状态,验证API返回是否符合预期。
- 若自定义了会员权限逻辑,需调整代码中的权限判断条件,确保与你的业务规则匹配。
内容的提问来源于stack exchange,提问作者Carl Larson
相关产品推荐
相关产品推荐

